vim配置.vimrc方案2
" Modeline and Notes {
" vim: set sw=4 ts=4 sts=4 et tw=78 foldmarker={,} foldlevel=0 foldmethod=marker spell:
"
" __ _ _____ _
" ___ _ __ / _/ |___ / __ __(_)_ __ ___
" / __| '_ | |_| | |_ _____ / /| | '_ ` _
" __ |_) | _| |___) |_____| V / | | | | | | |
" |___/ .__/|_| |_|____/ _/ |_|_| |_| |_|
" |_|
"
" This is the personal .vimrc file of Steve Francia.
" While much of it is beneficial for general use, I would
" recommend picking out the parts you want and understand.
"
" You can find me at http://spf13.com
"
" Copyright 2014 Steve Francia
"
" Licensed under the Apache License, Version 2.0 (the "License");
" you may not use this file except in compliance with the License.
" You may obtain a copy of the License at
"
" http://www.apache.org/licenses/LICENSE-2.0
"
" Unless required by applicable law or agreed to in writing, software
" distributed under the License is distributed on an "AS IS" BASIS,
" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
" See the License for the specific language governing permissions and
" limitations under the License.
" }
" Environment {
" Identify platform {
silent function! OSX()
return has('macunix')
endfunction
silent function! LINUX()
return has('unix') && !has('macunix') && !has('win32unix')
endfunction
silent function! WINDOWS()
return (has('win32') || has('win64'))
endfunction
" }
" Basics {
set nocompatible " Must be first line
if !WINDOWS()
set shell=/bin/sh
endif
" }
" Windows Compatible {
" On Windows, also use '.vim' instead of 'vimfiles'; this makes synchronization
" across (heterogeneous) systems easier.
if WINDOWS()
set runtimepath=$HOME/.vim,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,$HOME/.vim/after
endif
" }
" Arrow Key Fix {
" https://github.com/spf13/spf13-vim/issues/780
if &term[:4] == "xterm" || &term[:5] == 'screen' || &term[:3] == 'rxvt'
inoremap OC
endif
" }
" }
" Use before config if available {
if filereadable(expand("~/.vimrc.before"))
source ~/.vimrc.before
endif
" }
" Use bundles config {
if filereadable(expand("~/.vimrc.bundles"))
source ~/.vimrc.bundles
endif
" }
" General {
set background=dark " Assume a dark background
" Allow to trigger background
function! ToggleBG()
let s:tbg = &background
" Inversion
if s:tbg == "dark"
set background=light
else
set background=dark
endif
endfunction
noremap bg :call ToggleBG()
" if !has('gui')
"set term=$TERM " Make arrow and other keys work
" endif
filetype plugin indent on " Automatically detect file types.
syntax on " Syntax highlighting
set mouse=a " Automatically enable mouse usage
set mousehide " Hide the mouse cursor while typing
scriptencoding utf-8
if has('clipboard')
if has('unnamedplus') " When possible use + register for copy-paste
set clipboard=unnamed,unnamedplus
else " On mac and Windows, use * register for copy-paste
set clipboard=unnamed
endif
endif
" Most prefer to automatically switch to the current file directory when
" a new buffer is opened; to prevent this behavior, add the following to
" your .vimrc.before.local file:
" let g:spf13_no_autochdir = 1
if !exists('g:spf13_no_autochdir')
autocmd BufEnter * if bufname("") !~ "^[A-Za-z0-9]*://" | lcd %:p:h | endif
" Always switch to the current file directory
endif
"set autowrite " Automatically write a file when leaving a modified buffer
set shortmess+=filmnrxoOtT " Abbrev. of messages (avoids 'hit enter')
set viewoptions=folds,options,cursor,unix,slash " Better Unix / Windows compatibility
set virtualedit=onemore " Allow for cursor beyond last character
set history=1000 " Store a ton of history (default is 20)
set spell " Spell checking on
set hidden " Allow buffer switching without saving
set iskeyword-=. " '.' is an end of word designator
set iskeyword-=# " '#' is an end of word designator
set iskeyword-=- " '-' is an end of word designator
" Instead of reverting the cursor to the last position in the buffer, we
" set it to the first line when editing a git commit message
au FileType gitcommit au! BufEnter COMMIT_EDITMSG call setpos('.', [0, 1, 1, 0])
" http://vim.wikia.com/wiki/Restore_cursor_to_file_position_in_previous_editing_session
" Restore cursor to file position in previous editing session
" To disable this, add the following to your .vimrc.before.local file:
" let g:spf13_no_restore_cursor = 1
if !exists('g:spf13_no_restore_cursor')
function! ResCur()
if line("'"") <= line("$")
silent! normal! g`"
return 1
endif
endfunction
augroup resCur
autocmd!
autocmd BufWinEnter * call ResCur()
augroup END
endif
" Setting up the directories {
set backup " Backups are nice ...
if has('persistent_undo')
set undofile " So is persistent undo ...
set undolevels=1000 " Maximum number of changes that can be undone
set undoreload=10000 " Maximum number lines to save for undo on a buffer reload
endif
" To disable views add the following to your .vimrc.before.local file:
" let g:spf13_no_views = 1
if !exists('g:spf13_no_views')
" Add exclusions to mkview and loadview
" eg: *.*, svn-commit.tmp
let g:skipview_files = [
'[example pattern]'
]
endif
" }
" }
" Vim UI {
if !exists('g:override_spf13_bundles') && filereadable(expand("~/.vim/bundle/vim-colors-solarized/colors/solarized.vim"))
let g:solarized_termcolors=256
let g:solarized_termtrans=1
let g:solarized_contrast="normal"
let g:solarized_visibility="normal"
color solarized " Load a colorscheme
endif
set tabpagemax=15 " Only show 15 tabs
set showmode " Display the current mode
set cursorline " Highlight current line
highlight clear SignColumn " SignColumn should match background
highlight clear LineNr " Current line number row will have same background color in relative mode
"highlight clear CursorLineNr " Remove highlight color from current line number
if has('cmdline_info')
set ruler " Show the ruler
set rulerformat=%30(%=:b%n%y%m%r%w %l,%c%V %P%) " A ruler on steroids
set showcmd " Show partial commands in status line and
" Selected characters/lines in visual mode
endif
if has('statusline')
set laststatus=2
" Broken down into easily includeable segments
set statusline=%<%f " Filename
set statusline+=%w%h%m%r " Options
if !exists('g:override_spf13_bundles')
set statusline+=%{fugitive#statusline()} " Git Hotness
endif
set statusline+= [%{&ff}/%Y] " Filetype
set statusline+= [%{getcwd()}] " Current dir
set statusline+=%=%-14.(%l,%c%V%) %p%% " Right aligned file nav info
endif
set backspace=indent,eol,start " Backspace for dummies
set linespace=0 " No extra spaces between rows
set number " Line numbers on
set showmatch " Show matching brackets/parenthesis
set incsearch " Find as you type search
set hlsearch " Highlight search terms
set winminheight=0 " Windows can be 0 line high
set ignorecase " Case insensitive search
set smartcase " Case sensitive when uc present
set wildmenu " Show list instead of just completing
set wildmode=list:longest,full " Command completion, list matches, then longest common part, then all.
set whichwrap=b,s,h,l,<,>,[,] " Backspace and cursor keys wrap too
set scrolljump=5 " Lines to scroll when cursor leaves screen
set scrolloff=3 " Minimum lines to keep above and below cursor
set foldenable " Auto fold code
set list
set listchars=tab:› ,trail:•,extends:#,nbsp:. " Highlight problematic whitespace
" }
" Formatting {
set nowrap " Do not wrap long lines
set autoindent " Indent at the same level of the previous line
set shiftwidth=4 " Use indents of 4 spaces
set expandtab " Tabs are spaces, not tabs
set tabstop=4 " An indentation every four columns
set softtabstop=4 " Let backspace delete indent
set nojoinspaces " Prevents inserting two spaces after punctuation on a join (J)
set splitright " Puts new vsplit windows to the right of the current
set splitbelow " Puts new split windows to the bottom of the current
"set matchpairs+=<:> " Match, to be used with %
set pastetoggle= " pastetoggle (sane indentation on pastes)
"set comments=sl:/*,mb:*,elx:*/ " auto format comment blocks
" Remove trailing whitespaces and ^M chars
" To disable the stripping of whitespace, add the following to your
" .vimrc.before.local file:
" let g:spf13_keep_trailing_whitespace = 1
autocmd FileType c,cpp,java,go,php,javascript,puppet,python,rust,twig,xml,yml,perl,sql autocmd BufWritePre if !exists('g:spf13_keep_trailing_whitespace') | call StripTrailingWhitespace() | endif
"autocmd FileType go autocmd BufWritePre Fmt
autocmd BufNewFile,BufRead *.html.twig set filetype=html.twig
autocmd FileType haskell,puppet,ruby,yml setlocal expandtab shiftwidth=2 softtabstop=2
" preceding line best in a plugin but here for now.
autocmd BufNewFile,BufRead *.coffee set filetype=coffee
" Workaround vim-commentary for Haskell
autocmd FileType haskell setlocal commentstring=-- %s
" Workaround broken colour highlighting in Haskell
autocmd FileType haskell,rust setlocal nospell
" }
" Key (re)Mappings {
" The default leader is '', but many people prefer ',' as it's in a standard
" location. To override this behavior and set it back to '' (or any other
" character) add the following to your .vimrc.before.local file:
" let g:spf13_leader=''
if !exists('g:spf13_leader')
let mapleader = ','
else
let mapleader=g:spf13_leader
endif
if !exists('g:spf13_localleader')
let maplocalleader = '_'
else
let maplocalleader=g:spf13_localleader
endif
" The default mappings for editing and applying the spf13 configuration
" are ev and sv respectively. Change them to your preference
" by adding the following to your .vimrc.before.local file:
" let g:spf13_edit_config_mapping='ec'
" let g:spf13_apply_config_mapping='sc'
if !exists('g:spf13_edit_config_mapping')
let s:spf13_edit_config_mapping = 'ev'
else
let s:spf13_edit_config_mapping = g:spf13_edit_config_mapping
endif
if !exists('g:spf13_apply_config_mapping')
let s:spf13_apply_config_mapping = 'sv'
else
let s:spf13_apply_config_mapping = g:spf13_apply_config_mapping
endif
" Easier moving in tabs and windows
" The lines conflict with the default digraph mapping of
" If you prefer that functionality, add the following to your
" .vimrc.before.local file:
" let g:spf13_no_easyWindows = 1
if !exists('g:spf13_no_easyWindows')
map j_
map k_
map l_
map h_
endif
" Wrapped lines goes down/up to next row, rather than next line in file.
noremap j gj
noremap k gk
" End/Start of line motion keys act relative to row/wrap width in the
" presence of `:set wrap`, and relative to line for `:set nowrap`.
" Default vim behaviour is to act relative to text line in both cases
" If you prefer the default behaviour, add the following to your
" .vimrc.before.local file:
" let g:spf13_no_wrapRelMotion = 1
if !exists('g:spf13_no_wrapRelMotion')
" Same for 0, home, end, etc
function! WrapRelativeMotion(key, ...)
let vis_sel=""
if a:0
let vis_sel="gv"
endif
if &wrap
execute "normal!" vis_sel . "g" . a:key
else
execute "normal!" vis_sel . a:key
endif
endfunction
" Map g* keys in Normal, Operator-pending, and Visual+select
noremap $ :call WrapRelativeMotion("$")
noremap :call WrapRelativeMotion("$")
noremap 0 :call WrapRelativeMotion("0")
noremap :call WrapRelativeMotion("0")
noremap ^ :call WrapRelativeMotion("^")
" Overwrite the operator pending $/ mappings from above
" to force inclusive motion with :execute normal!
onoremap $ v:call WrapRelativeMotion("$")
onoremap v:call WrapRelativeMotion("$")
" Overwrite the Visual+select mode mappings from above
" to ensure the correct vis_sel flag is passed to function
vnoremap $ :call WrapRelativeMotion("$", 1)
vnoremap :call WrapRelativeMotion("$", 1)
vnoremap 0 :call WrapRelativeMotion("0", 1)
vnoremap :call WrapRelativeMotion("0", 1)
vnoremap ^ :call WrapRelativeMotion("^", 1)
endif
" The following two lines conflict with moving to top and
" bottom of the screen
" If you prefer that functionality, add the following to your
" .vimrc.before.local file:
" let g:spf13_no_fastTabs = 1
if !exists('g:spf13_no_fastTabs')
map gT
map gt
endif
" Stupid shift key fixes
if !exists('g:spf13_no_keyfixes')
if has("user_commands")
command! -bang -nargs=* -complete=file E e
command! -bang -nargs=* -complete=file W w
command! -bang -nargs=* -complete=file Wq wq
command! -bang -nargs=* -complete=file WQ wq
command! -bang Wa wa
command! -bang WA wa
command! -bang Q q
command! -bang QA qa
command! -bang Qa qa
endif
cmap Tabe tabe
endif
" Yank from the cursor to the end of the line, to be consistent with C and D.
nnoremap Y y$
" Code folding options
nmap f0 :set foldlevel=0
nmap f1 :set foldlevel=1
nmap f2 :set foldlevel=2
nmap f3 :set foldlevel=3
nmap f4 :set foldlevel=4
nmap f5 :set foldlevel=5
nmap f6 :set foldlevel=6
nmap f7 :set foldlevel=7
nmap f8 :set foldlevel=8
nmap f9 :set foldlevel=9
" Most prefer to toggle search highlighting rather than clear the current
" search results. To clear search highlighting rather than toggle it on
" and off, add the following to your .vimrc.before.local file:
" let g:spf13_clear_search_highlight = 1
if exists('g:spf13_clear_search_highlight')
nmap / :nohlsearch
else
nmap / :set invhlsearch
endif
" Find merge conflict markers
map fc /v^[<|=>]{7}( .*|$)
" Shortcuts
" Change Working Directory to that of the current file
cmap cwd lcd %:p:h
cmap cd. lcd %:p:h
" Visual shifting (does not exit Visual mode)
vnoremap < >gv
" Allow using the repeat operator with a visual selection (!)
" http://stackoverflow.com/a/8064607/127816
vnoremap . :normal .
" For when you forget to sudo.. Really Write the file.
cmap w!! w !sudo tee % >/dev/null
" Some helpers to edit mode
" http://vimcasts.org/e/14
cnoremap %% =fnameescape(expand('%:h')).'/'
map ew :e %%
map es :sp %%
map ev :vsp %%
map et :tabe %%
" Adjust viewports to the same size
map = =
" Map ff to display all lines with keyword under cursor
" and ask which one to jump to
nmap ff [I:let nr = input("Which one: ")exe "normal " . nr ."[t"
" Easier horizontal scrolling
map zl zL
map zh zH
" Easier formatting
nnoremap q gwip
" FIXME: Revert this f70be548
" fullscreen mode for GVIM and Terminal, need 'wmctrl' in you PATH
map :call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
" }
" Plugins {
" GoLang {
if count(g:spf13_bundle_groups, 'go')
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_structs = 1
let g:go_highlight_operators = 1
let g:go_highlight_build_constraints = 1
let g:go_fmt_command = "goimports"
let g:syntastic_go_checkers = ['golint', 'govet', 'errcheck']
let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] }
au FileType go nmap s (go-implements)
au FileType go nmap i (go-info)
au FileType go nmap e (go-rename)
au FileType go nmap r (go-run)
au FileType go nmap b (go-build)
au FileType go nmap t (go-test)
au FileType go nmap gd (go-doc)
au FileType go nmap gv (go-doc-vertical)
au FileType go nmap co (go-coverage)
endif
" }
" TextObj Sentence {
if count(g:spf13_bundle_groups, 'writing')
augroup textobj_sentence
autocmd!
autocmd FileType markdown call textobj#sentence#init()
autocmd FileType textile call textobj#sentence#init()
autocmd FileType text call textobj#sentence#init()
augroup END
endif
" }
" TextObj Quote {
if count(g:spf13_bundle_groups, 'writing')
augroup textobj_quote
autocmd!
autocmd FileType markdown call textobj#quote#init()
autocmd FileType textile call textobj#quote#init()
autocmd FileType text call textobj#quote#init({'educate': 0})
augroup END
endif
" }
" PIV {
if isdirectory(expand("~/.vim/bundle/PIV"))
let g:DisableAutoPHPFolding = 0
let g:PIVAutoClose = 0
endif
" }
" Misc {
if isdirectory(expand("~/.vim/bundle/nerdtree"))
let g:NERDShutUp=1
endif
if isdirectory(expand("~/.vim/bundle/matchit.zip"))
let b:match_ignorecase = 1
endif
" }
" OmniComplete {
" To disable omni complete, add the following to your .vimrc.before.local file:
" let g:spf13_no_omni_complete = 1
if !exists('g:spf13_no_omni_complete')
if has("autocmd") && exists("+omnifunc")
autocmd Filetype *
if &omnifunc == "" |
setlocal omnifunc=syntaxcomplete#Complete |
endif
endif
hi Pmenu guifg=#000000 guibg=#F8F8F8 ctermfg=black ctermbg=Lightgray
hi PmenuSbar guifg=#8A95A7 guibg=#F8F8F8 gui=NONE ctermfg=darkcyan ctermbg=lightgray cterm=NONE
hi PmenuThumb guifg=#F8F8F8 guibg=#8A95A7 gui=NONE ctermfg=lightgray ctermbg=darkcyan cterm=NONE
" Some convenient mappings
"inoremap pumvisible() ? "" : ""
if exists('g:spf13_map_cr_omni_complete')
inoremap pumvisible() ? "" : ""
endif
inoremap pumvisible() ? "" : ""
inoremap pumvisible() ? "" : ""
inoremap pumvisible() ? "" : ""
inoremap pumvisible() ? "" : ""
" Automatically open and close the popup menu / preview window
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
set completeopt=menu,preview,longest
endif
" }
" Ctags {
set tags=./tags;/,~/.vimtags
" Make tags placed in .git/tags file available in all levels of a repository
let gitroot = substitute(system('git rev-parse --show-toplevel'), '[nr]', '', 'g')
if gitroot != ''
let &tags = &tags . ',' . gitroot . '/.git/tags'
endif
" }
" AutoCloseTag {
" Make it so AutoCloseTag works for xml and xhtml files as well
au FileType xhtml,xml ru ftplugin/html/autoclosetag.vim
nmap ac ToggleAutoCloseMappings
" }
" SnipMate {
" Setting the author var
" If forking, please overwrite in your .vimrc.local file
let g:snips_author = 'Steve Francia '
" }
" NerdTree {
if isdirectory(expand("~/.vim/bundle/nerdtree"))
map NERDTreeTabsToggle
map e :NERDTreeFind
nmap nt :NERDTreeFind
let NERDTreeShowBookmarks=1
let NERDTreeIgnore=['.py[cd]$', '~$', '.swo$', '.swp$', '^.git$', '^.hg$', '^.svn$', '.bzr$']
let NERDTreeChDirMode=0
let NERDTreeQuitOnOpen=1
let NERDTreeMouseMode=2
let NERDTreeShowHidden=1
let NERDTreeKeepTreeInNewTab=1
let g:nerdtree_tabs_open_on_gui_startup=0
endif
" }
" Tabularize {
if isdirectory(expand("~/.vim/bundle/tabular"))
nmap a& :Tabularize /&
vmap a& :Tabularize /&
nmap a= :Tabularize /^[^=]*zs=
vmap a= :Tabularize /^[^=]*zs=
nmap a=> :Tabularize /=>
vmap a=> :Tabularize /=>
nmap a: :Tabularize /:
vmap a: :Tabularize /:
nmap a:: :Tabularize /:zs
vmap a:: :Tabularize /:zs
nmap a, :Tabularize /,
vmap a, :Tabularize /,
nmap a,, :Tabularize /,zs
vmap a,, :Tabularize /,zs
nmap a :Tabularize /
vmap a :Tabularize /
endif
" }
" Session List {
set sessionoptions=blank,buffers,curdir,folds,tabpages,winsize
if isdirectory(expand("~/.vim/bundle/sessionman.vim/"))
nmap sl :SessionList
nmap ss :SessionSave
nmap sc :SessionClose
endif
" }
" JSON {
nmap jt :%!python -m json.tool:set filetype=json
let g:vim_json_syntax_conceal = 0
" }
" PyMode {
" Disable if python support not present
if !has('python') && !has('python3')
let g:pymode = 0
endif
if isdirectory(expand("~/.vim/bundle/python-mode"))
let g:pymode_lint_checkers = ['pyflakes']
let g:pymode_trim_whitespaces = 0
let g:pymode_options = 0
let g:pymode_rope = 0
endif
" }
" ctrlp {
if isdirectory(expand("~/.vim/bundle/ctrlp.vim/"))
let g:ctrlp_working_path_mode = 'ra'
nnoremap :CtrlP
nnoremap :CtrlPMRU
let g:ctrlp_custom_ignore = {
'dir': '.git$|.hg$|.svn$',
'file': '.exe$|.so$|.dll$|.pyc$' }
if executable('ag')
let s:ctrlp_fallback = 'ag %s --nocolor -l -g ""'
elseif executable('ack-grep')
let s:ctrlp_fallback = 'ack-grep %s --nocolor -f'
elseif executable('ack')
let s:ctrlp_fallback = 'ack %s --nocolor -f'
" On Windows use "dir" as fallback command.
elseif WINDOWS()
let s:ctrlp_fallback = 'dir %s /-n /b /s /a-d'
else
let s:ctrlp_fallback = 'find %s -type f'
endif
if exists("g:ctrlp_user_command")
unlet g:ctrlp_user_command
endif
let g:ctrlp_user_command = {
'types': {
1: ['.git', 'cd %s && git ls-files . --cached --exclude-standard --others'],
2: ['.hg', 'hg --cwd %s locate -I .'],
},
'fallback': s:ctrlp_fallback
}
if isdirectory(expand("~/.vim/bundle/ctrlp-funky/"))
" CtrlP extensions
let g:ctrlp_extensions = ['funky']
"funky
nnoremap fu :CtrlPFunky
endif
endif
"}
" TagBar {
if isdirectory(expand("~/.vim/bundle/tagbar/"))
nnoremap tt :TagbarToggle
endif
"}
" Rainbow {
if isdirectory(expand("~/.vim/bundle/rainbow/"))
let g:rainbow_active = 1 "0 if you want to enable it later via :RainbowToggle
endif
"}
" Fugitive {
if isdirectory(expand("~/.vim/bundle/vim-fugitive/"))
nnoremap gs :Gstatus
nnoremap gd :Gdiff
nnoremap gc :Gcommit
nnoremap gb :Gblame
nnoremap gl :Glog
nnoremap gp :Git push
nnoremap gr :Gread
nnoremap gw :Gwrite