The ultimate Vim configuration (vimrc)

简介:
"   Maintainer:  amix the lucky stiff
"             http://amix.dk - amix@amix.dk
"
"   Version:  3.3 - 21/01/10 01:05:46
"
"   Blog_post:  
"       http://amix.dk/blog/post/19486#The-ultimate-vim-configuration-vimrc
"   Syntax_highlighted:
"       http://amix.dk/vim/vimrc.html
"   Raw_version:  
"       http://amix.dk/vim/vimrc.txt
"
"   How_to_Install:
"    $ mkdir ~/.vim_runtime
"    $ svn co svn://orangoo.com/vim ~/.vim_runtime
"    $ cat ~/.vim_runtime/install.sh
"    $ sh ~/.vim_runtime/install.sh <system>
"      <sytem> can be `mac`, `linux` or `windows`
"
"   How_to_Upgrade:
"    $ svn update ~/.vim_runtime
"
"   Sections:
"    -> General
"    -> VIM user interface
"    -> Colors and Fonts
"    -> Files and backups
"    -> Text, tab and indent related
"    -> Visual mode related
"    -> Command mode related
"    -> Moving around, tabs and buffers
"    -> Statusline
"    -> Parenthesis/bracket expanding
"    -> General Abbrevs
"    -> Editing mappings
"
"    -> Cope
"    -> Minibuffer plugin
"    -> Omni complete functions
"    -> Python section
"    -> JavaScript section
"
"   Plugins_Included:
"     > minibufexpl.vim - http://www.vim.org/scripts/script.php?script_id=159
"       Makes it easy to get an overview of buffers:
"           info -> :e ~/.vim_runtime/plugin/minibufexpl.vim
"
"     > bufexplorer - http://www.vim.org/scripts/script.php?script_id=42
"       Makes it easy to switch between buffers:
"           info -> :help bufExplorer
"
"     > yankring.vim - http://www.vim.org/scripts/script.php?script_id=1234
"       Emacs's killring, useful when using the clipboard:
"           info -> :help yankring
"
"     > surround.vim - http://www.vim.org/scripts/script.php?script_id=1697
"       Makes it easy to work with surrounding text:
"           info -> :help surround
"
"     > snipMate.vim - http://www.vim.org/scripts/script.php?script_id=2540
"       Snippets for many languages (similar to TextMate's):
"           info -> :help snipMate
"
"     > fuzzyfinder - http://www.vim.org/scripts/script.php?script_id=1984
"       Find files fast (similar to TextMate's feature):
"           info -> :help fuzzyfinder@en
"
"    Revisions:
"     > 3.3: Added syntax highlighting for Mako mako.vim 
"     > 3.2: Turned on python_highlight_all for better syntax
"            highlighting for Python
"     > 3.1: Added revisions ;) and bufexplorer.vim
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Sets how many lines of history VIM has to remember
set   history =300

" Enable filetype plugin
filetype   plugin   on
filetype   indent   on

" Set to auto read when a file is changed from the outside
set   autoread

" With a map leader it's possible to do extra key combinations
" like <leader>w saves the current file
let  mapleader  =   ","
let  g:mapleader  =   ","

" Fast saving
nmap   < leader > w :w! < cr >

" Fast editing of the .vimrc
map   < leader > e :e! ~/.vim_runtime/vimrc < cr >

" When vimrc is edited, reload it
autocmd !   bufwritepost  vimrc  source  ~/ . vim_runtime/vimrc


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => VIM user interface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Set 7 lines to the curors - when moving vertical..
set   so =7

set   wildmenu   "Turn on WiLd menu

set   ruler   "Always show current position

set   cmdheight =2  "The commandbar height

set   hid   "Change buffer - without saving

" Set backspace config
set   backspace =eol , start , indent
set   whichwrap += < , > , h , l

set   ignorecase   "Ignore case when searching

set   hlsearch   "Highlight search things

set   incsearch   "Make search act like search in modern browsers

set   magic   "Set magic on, for regular expressions

set   showmatch   "Show matching bracets when text indicator is over them
set   mat =2  "How many tenths of a second to blink

" No sound on errors
set   noerrorbells
set   novisualbell
set   t_vb =


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Colors and Fonts
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
syntax   enable   "Enable syntax hl

" Set font according to system
if   MySys ()   ==   "mac"
   set   gfn =Bitstream\ Vera\ Sans\ Mono : h13
   set   shell =/bin/bash
elseif   MySys ()   ==   "windows"
   set   gfn =Bitstream\ Vera\ Sans\ Mono : h10
elseif   MySys ()   ==   "linux"
   set   gfn =Monospace\ 10
   set   shell =/bin/bash
endif

if   has ( "gui_running" )
   set   guioptions -=T
   set   background =dark
   set   t_Co =256
   set   background =dark
   colorscheme  peaksea

   set   nu
else
   colorscheme  zellner
   set   background =dark
  
   set   nonu
endif

set   encoding =utf8
try
     lang  en_US
catch
endtry

set   ffs =unix , dos , mac  "Default file types


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Files and backups
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Turn backup off, since most stuff is in SVN, git anyway...
set   nobackup
set   nowb
set   noswapfile


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Text, tab and indent related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set   expandtab
set   shiftwidth =4
set   tabstop =4
set   smarttab

set   lbr
set   tw =500

set   ai   "Auto indent
set   si   "Smart indet
set   wrap   "Wrap lines

map   < leader > t2 :setlocal shiftwidth=2 < cr >
map   < leader > t4 :setlocal shiftwidth=4 < cr >
map   < leader > t8 :setlocal shiftwidth=4 < cr >


""""""""""""""""""""""""""""""
" => Visual mode related
""""""""""""""""""""""""""""""
" Really useful!
"  In visual mode when you press * or # to search for the current selection
vnoremap   < silent >  * :call VisualSearch('f') < CR >
vnoremap   < silent >  # :call VisualSearch('b') < CR >

" When you press gv you vimgrep after the selected text
vnoremap   < silent >  gv :call VisualSearch('gv') < CR >
map   < leader > g :vimgrep // **/*. < left >< left >< left >< left >< left >< left >< left >


function ! CmdLine ( str )
     exe   "menu Foo.Bar :"   .  a:str
     emenu  Foo . Bar
     unmenu  Foo
endfunction  

" From an idea by Michael Naumann
function ! VisualSearch ( direction )  range
     let  l:saved_reg  =   @"
     execute   "normal! vgvy"

     let  l:pattern  =   escape ( @" ,   '\\/.*$^~[]' )
     let  l:pattern  =   substitute ( l:pattern,   "\n$" ,   "" ,   "" )

     if   a:direction   ==   'b'
         execute   "normal ?"   .  l:pattern  .   "^M"
     elseif   a:direction   ==   'gv'
         call   CmdLine ( "vimgrep "   .   '/' .  l:pattern   .   '/'   .   ' **/*.' )
     elseif   a:direction   ==   'f'
         execute   "normal /"   .  l:pattern  .   "^M"
     endif

     let  @/   =   l :pattern
     let   @"   =   l :saved_reg
endfunction



"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Command mode related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Smart mappings on the command line
cno  $h e ~/
cno  $d e ~/Desktop/
cno  $j e ./
cno  $c e   < C- \> eCurrentFileDir("e") < cr >

" $q is super useful when browsing on the command line
cno  $q  < C- \> eDeleteTillSlash() < cr >

" Bash like keys for the command line
cnoremap   < C-A >        < Home >
cnoremap   < C-E >        < End >
cnoremap   < C-K >        < C-U >

cnoremap   < C-P >   < Up >
cnoremap   < C-N >   < Down >

" Useful on some European keyboards
map  ½ $
imap  ½ $
vmap  ½ $
cmap  ½ $


func ! Cwd ()
   let  cwd  =   getcwd ()
   return   "e   " . cwd 
endfunc

func ! DeleteTillSlash ()
   let  g:cmd  =   getcmdline ()
   if   MySys ()   ==   "linux"   ||   MySys ()   ==   "mac"
     let  g:cmd_edited  =   substitute ( g:cmd,   " \\ (.*/
\\ ).*" ,   " \\ 1" ,   "" )
   else
     let  g:cmd_edited  =   substitute ( g:cmd,   " \\ (.*\[ \\\\ ] \\ ).*" ,   " \\ 1" ,   "" )
   endif
   if  g:cmd  ==  g:cmd_edited
     if   MySys ()   ==   "linux"   ||   MySys ()   ==   "mac"
       let  g:cmd_edited  =   substitute ( g:cmd,   " \\ (.*/
\\ ).*/" ,   " \\ 1" ,   "" )
     else
       let  g:cmd_edited  =   substitute ( g:cmd,   " \\ (.*\[ \\\\ \] \\ ).*\[ \\\\ \]" ,   " \\ 1" ,   "" )
     endif
   endif     
   return  g:cmd_edited
endfunc

func ! CurrentFileDir ( cmd )
   return   a:cmd   .   " "   .   expand ( "%:p:h" )   .   "/"
endfunc


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Moving around, tabs and buffers
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Map space to / (search) and c-space to ? (backgwards search)
map   < space >  /
map   < c-space >  ?
map   < silent >   < leader > < cr >  :noh < cr >

" Smart way to move btw. windows
map   < C-j >   < C-W > j
map   < C-k >   < C-W > k
map   < C-h >   < C-W > h
map   < C-l >   < C-W > l

" Close the current buffer
map   < leader > bd :Bclose < cr >

" Close all the buffers
map   < leader > ba :1,300 bd! < cr >

" Use the arrows to something usefull
map   < right >  :bn < cr >
map   < left >  :bp < cr >

" Tab configuration
map   < leader > tn :tabnew % < cr >
map   < leader > te :tabedit  
map   < leader > tc :tabclose < cr >
map   < leader > tm :tabmove  

" When pressing <leader>cd switch to the directory of the open buffer
map   < leader > cd :cd %:p:h < cr >


command ! Bclose  call   < SID > BufcloseCloseIt ()
function !   <SID> BufcloseCloseIt ()
     let  l:currentBufNum  =   bufnr ( "%" )
     let  l:alternateBufNum  =   bufnr ( "#" )

     if   buflisted ( l:alternateBufNum )
       buffer  #
     else
       bnext
     endif

     if   bufnr ( "%" )   ==   l :currentBufNum
       new
     endif

     if   buflisted ( l:currentBufNum )
       execute ( "bdelete! " . l:currentBufNum )
     endif
endfunction

" Specify the behavior when switching between buffers 
try
   set   switchbuf =usetab
   set   stal =2
catch
endtry


""""""""""""""""""""""""""""""
" => Statusline
""""""""""""""""""""""""""""""
" Always hide the statusline
set   laststatus =2

" Format the statusline
set   statusline =\ %F%m%r%h\ %w\ \ CWD : \ %r%{CurDir()}%h\ \ \ Line : \ %l/%L : %c


function ! CurDir ()
     let  curdir  =   substitute ( getcwd () ,   '/Users/amir/' ,   "~/" ,   "g" )
     return  curdir
endfunction


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Parenthesis/bracket expanding
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vnoremap  $1  < esc > `>a) < esc > `<i( < esc >
vnoremap  $2  < esc > `>a] < esc > `<i[ < esc >
vnoremap  $3  < esc > `>a} < esc > `<i{ < esc >
vnoremap  $$  < esc > `>a" < esc > `<i" < esc >
vnoremap  $q  < esc > `>a' < esc > `<i' < esc >
vnoremap  $e  < esc > `>a" < esc > `<i" < esc >

" Map auto complete of (, ", ', [
inoremap  $1 () < esc > i
inoremap  $2 [] < esc > i
inoremap  $3 {} < esc > i
inoremap  $4 { < esc > o} < esc > O
inoremap  $q '' < esc > i
inoremap  $e "" < esc > i


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General Abbrevs
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
iab  xdate  < c-r > =strftime("%d/%m/%y %H:%M:%S") < cr >


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Editing mappings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remap VIM 0
map  0 ^

"Move a line of text using ALT+[jk] or Comamnd+[jk] on mac
nmap   < M-j >  mz:m+ < cr > `z
nmap   < M-k >  mz:m-2 < cr > `z
vmap   < M-j >  :m'>+ < cr > `<my`>mzgv`yo`z
vmap   < M-k >  :m'<-2 < cr > `>my`<mzgv`yo`z

if   MySys ()   ==   "mac"
   nmap   < D-j >   < M-j >
   nmap   < D-k >   < M-k >
   vmap   < D-j >   < M-j >
   vmap   < D-k >   < M-k >
endif

"Delete trailing white space, useful for Python ;)
func ! DeleteTrailingWS ()
   exe   "normal mz"
   % s / \s\+$ // ge
   exe   "normal `z"
endfunc
autocmd   BufWrite  *.py : call   DeleteTrailingWS ()


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Cope
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Do :help cope if you are unsure what cope is. It's super useful!
map   < leader > cc :botright cope < cr >
map   < leader > n :cn < cr >
map   < leader > p :cp < cr >


""""""""""""""""""""""""""""""
" => bufExplorer plugin
""""""""""""""""""""""""""""""
let  g:bufExplorerDefaultHelp = 0
let  g:bufExplorerShowRelativePath = 1


""""""""""""""""""""""""""""""
" => Minibuffer plugin
""""""""""""""""""""""""""""""
let  g:miniBufExplModSelTarget  =   1
let  g:miniBufExplorerMoreThanOne  =   2
let  g:miniBufExplModSelTarget  =   0
let  g:miniBufExplUseSingleClick  =   1
let  g:miniBufExplMapWindowNavVim  =   1
let  g:miniBufExplVSplit  =   25
let  g:miniBufExplSplitBelow = 1

let  g:bufExplorerSortBy  =   "name"

autocmd   BufRead , BufNew  :call UMiniBufExplorer

map   < leader > u :TMiniBufExplorer < cr > :TMiniBufExplorer < cr >


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Omni complete functions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
autocmd   FileType  css  set   omnifunc =csscomplete#CompleteCSS


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Pressing ,ss will toggle and untoggle spell checking
map   < leader > ss :setlocal spell! < cr >

"Shortcuts using <leader>
map   < leader > sn ]s
map   < leader > sp [s
map   < leader > sa zg
map   < leader > s? z=


""""""""""""""""""""""""""""""
" => Python section
""""""""""""""""""""""""""""""
au   FileType  python  set   nocindent
let  python_highlight_all  =   1
au   FileType  python  syn   keyword  pythonDecorator True None False self

au   BufNewFile , BufRead  *.jinja  set   syntax =htmljinja
au   BufNewFile , BufRead  *.mako  set   ft =mako

au   FileType  python  inoremap   < buffer >  $r return  
au   FileType  python  inoremap   < buffer >  $i import  
au   FileType  python  inoremap   < buffer >  $p print  
au   FileType  python  inoremap   < buffer >  $f #--- PH ---------------------------------------------- < esc > FP2xi
au   FileType  python  map   < buffer >   < leader > 1 /class  
au   FileType  python  map   < buffer >   < leader > 2 /def  
au   FileType  python  map   < buffer >   < leader > C ?class  
au   FileType  python  map   < buffer >   < leader > D ?def  


""""""""""""""""""""""""""""""
" => JavaScript section
"""""""""""""""""""""""""""""""
au   FileType  javascript  call   JavaScriptFold ()
au   FileType  javascript  setl   fen
au   FileType  javascript  setl   nocindent

au   FileType  javascript  imap   < c-t >  AJS.log(); < esc > hi
au   FileType  javascript  imap   < c-a >  alert(); < esc > hi

au   FileType  javascript  inoremap   < buffer >  $r return  
au   FileType  javascript  inoremap   < buffer >  $f //--- PH ---------------------------------------------- < esc > FP2xi

function ! JavaScriptFold ()  
     setl   foldmethod =syntax
     setl   foldlevelstart =1
    syn region foldBraces  start = / { / end = / } / transparent  fold  keepend extend

     function ! FoldText ()
     return   substitute ( getline ( v:foldstart ) ,   '{.*' ,   '{...}' ,   '' )
     endfunction
     setl   foldtext =FoldText()
endfunction


""""""""""""""""""""""""""""""
" => Fuzzy finder
""""""""""""""""""""""""""""""
try
     call  fuf# defineLaunchCommand ( 'FufCWD' ,   'file' ,   'fnamemodify(getcwd(), ''%:p:h'')' )
     map   < leader > t :FufCWD **/ < CR >
catch
endtry


""""""""""""""""""""""""""""""
" => Vim grep
""""""""""""""""""""""""""""""
let  Grep_Skip_Dirs  =   'RCS CVS SCCS .svn generated'
set   grepprg =/bin/grep\ -nH


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => MISC
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Remove the Windows ^M - when the encodings gets messed up
noremap   < Leader > m mmHmt:%s/ < C-V >< cr > //ge < cr > 'tzt'm

"Quickly open a buffer for scripbble
map   < leader > q :e ~/buffer < cr >
目录
打赏
0
0
0
0
96
分享
相关文章
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器(三)
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器
379 0
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器(三)
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器(二)
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器
265 0
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器(二)
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器(一)
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器
1056 0
【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器(一)
5.11 Vim配置文件(.vimrc)详解
Vim 启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim。
1220 0
5.11 Vim配置文件(.vimrc)详解
Vim使用笔记之.vimrc配置
之前陆陆续续有用过一点vim,但基本上都没有详细地去了解这个强大的编辑器,最近开始重新学习一下Vim。刚开始使用Vim的感觉就是好简洁,可以说是什么东西都没有,无从下手。
2115 0
Vim配置文件vimrc
**set nocompatible filetype plugin on ” 载入文件类型插件 filetype indent on ” 为特定文件类型载入缩进文件 ...
977 0
Vim的行号、语法显示等设置(.vimrc文件的配置)以及乱码解决
在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进 等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本, 所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:vi ~/.vimrc #支持putty鼠标粘贴 if has('mouse')    set mouse -= a endif 设置完后:x 或者 $wq 进行保存退出即可。
1660 0