【译】史上最强的vimrc文件

时间:2021-06-26 17:17:46

史上最强的vimrc文件http://amix.dk/vim/vimrc.html, 据说有800行,还是作者精简后的结果.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Maintainer: amix the lucky stiff
" http://amix.dk - amix@amix.dk
"
" Version: 3.6 - 25/08/10 14:40:30
"
" Blog_post: 发布的博客地址
" http://amix.dk/blog/post/19486#The-ultimate-vim-configuration-vimrc
" Syntax_highlighted: 带有语法高亮的html版本
" http://amix.dk/vim/vimrc.html
" Raw_version: txt原始版本
" http://amix.dk/vim/vimrc.txt
"
" How_to_Install_on_Unix: 如何在Unix系统上安装
" $ 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 Python设置
" -> JavaScript section JavaScript设置

"
"
" 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
"
" > mru.vim - http://www.vim.org/scripts/script.php?script_id=521
" Plugin to manage Most Recently Used (MRU) files:管理最近使用的文件的一种插件
" info -> :e ~/.vim_runtime/plugin/mru.vim
"
" > Command-T - http://www.vim.org/scripts/script.php?script_id=3025
" Command-T plug-in provides an extremely fast, intuitive mechanism for opening filesa:
" info -> :help CommandT
" screencast and web-help -> http://amix.dk/blog/post/19501
"
"
" Revisions: 修订
" > 3.6: Added lots of stuff (colors, Command-T, Vim 7.3 persistent undo etc.)
             "添加东西很多(例如:颜色,- T的命令Vim的7.3持久撤消
" > 3.5: Paste mode is now shown in status line if you are in paste mode 在状态栏中增加了显示粘贴模式
" > 3.4: Added mru.vim 增加了mru.vim插件
" > 3.3: Added syntax highlighting for Mako mako.vim 为mako插件增加语法高亮
" > 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=700

" 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 .vimrc 被修改时,自动生效
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 smartcase

set hlsearch "Highlight search things

set incsearch "Make search act like search in modern browsers
set nolazyredraw "Don't redraw while executing macros

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=
set tm=500


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

" Set font according to system 根据系统改变字体
if MySys() == "mac"
set gfn=Menlo:h14
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 t_Co=256
set background=dark
colorscheme peaksea
set nonu
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, backups and undo 文件,备份和撤销
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Turn backup off, since most stuff is in SVN, git anyway... 打开备份
set nobackup
set nowb
set noswapfile

"Persistent undo 永久撤销
try
if MySys() == "windows"
set undodir=C:\Windows\Temp
else
set undodir=~/.vim_runtime/undodir
endif

set undofile
catch
endtry


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => 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


""""""""""""""""""""""""""""""
" => 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 设置当你按下GV vimgrep选定的文本
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 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=\ %{HasPaste()}%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

function! HasPaste()
if
&paste
return 'PASTE MODE '
else
return ''
endif
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
inoremap $t
<><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()

set guitablabel=%t


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => 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
map
<leader>o :BufExplorer<cr>


""""""""""""""""""""""""""""""
" => 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>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => 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
""""""""""""""""""""""""""""""
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


""""""""""""""""""""""""""""""
" => MRU plugin
""""""""""""""""""""""""""""""
let MRU_Max_Entries = 400
map
<leader>f :MRU<CR>


""""""""""""""""""""""""""""""
" => Command-T
""""""""""""""""""""""""""""""
let g:CommandTMaxHeight = 15
set wildignore+=*.o,*.obj,.git,*.pyc
noremap
<leader>j :CommandT<cr>
noremap
<leader>y :CommandTFlush<cr>


""""""""""""""""""""""""""""""
" => 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>
au BufRead,BufNewFile ~/buffer iab
<buffer> xh1 ===========================================

map
<leader>pp :setlocal paste!<cr>

map
<leader>bb :cd ..<cr>