" 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'), '[\n\r]', '', '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 nnoremap ge :Gedit " Mnemonic _i_nteractive nnoremap gi :Git add -p % nnoremap gg :SignifyToggle endif "} " YouCompleteMe { if count(g:spf13_bundle_groups, 'youcompleteme') let g:acp_enableAtStartup = 0 " enable completion from tags let g:ycm_collect_identifiers_from_tags_files = 1 " remap Ultisnips for compatibility for YCM let g:UltiSnipsExpandTrigger = '' let g:UltiSnipsJumpForwardTrigger = '' let g:UltiSnipsJumpBackwardTrigger = '' " Enable omni completion. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS autocmd FileType python setlocal omnifunc=pythoncomplete#Complete autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete autocmd FileType haskell setlocal omnifunc=necoghc#omnifunc " Haskell post write lint and check with ghcmod " $ `cabal install ghcmod` if missing and ensure " ~/.cabal/bin is in your $PATH. if !executable("ghcmod") autocmd BufWritePost *.hs GhcModCheckAndLintAsync endif " For snippet_complete marker. if !exists("g:spf13_no_conceal") if has('conceal') set conceallevel=2 concealcursor=i endif endif " Disable the neosnippet preview candidate window " When enabled, there can be too much visual noise " especially when splits are used. set completeopt-=preview endif " } " neocomplete { if count(g:spf13_bundle_groups, 'neocomplete') let g:acp_enableAtStartup = 0 let g:neocomplete#enable_at_startup = 1 let g:neocomplete#enable_smart_case = 1 let g:neocomplete#enable_auto_delimiter = 1 let g:neocomplete#max_list = 15 let g:neocomplete#force_overwrite_completefunc = 1 " Define dictionary. let g:neocomplete#sources#dictionary#dictionaries = { \ 'default' : '', \ 'vimshell' : $HOME.'/.vimshell_hist', \ 'scheme' : $HOME.'/.gosh_completions' \ } " Define keyword. if !exists('g:neocomplete#keyword_patterns') let g:neocomplete#keyword_patterns = {} endif let g:neocomplete#keyword_patterns['default'] = '\h\w*' " Plugin key-mappings { " These two lines conflict with the default digraph mapping of if !exists('g:spf13_no_neosnippet_expand') imap (neosnippet_expand_or_jump) smap (neosnippet_expand_or_jump) endif if exists('g:spf13_noninvasive_completion') inoremap " takes you out of insert mode inoremap pumvisible() ? "\\" : "\" " accepts first, then sends the inoremap pumvisible() ? "\\" : "\" " and cycle like and inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" " Jump up and down the list inoremap pumvisible() ? "\\\" : "\" inoremap pumvisible() ? "\\\" : "\" else " Complete Snippet " Jump to next snippet point imap neosnippet#expandable() ? \ "\(neosnippet_expand_or_jump)" : (pumvisible() ? \ "\" : "\(neosnippet_expand_or_jump)") smap (neosnippet_jump_or_expand) inoremap neocomplete#undo_completion() inoremap neocomplete#complete_common_string() "inoremap neocomplete#complete_common_string() " : close popup " : close popup and save indent. inoremap pumvisible() ? neocomplete#smart_close_popup()."\" : "\" function! CleverCr() if pumvisible() if neosnippet#expandable() let exp = "\(neosnippet_expand)" return exp . neocomplete#smart_close_popup() else return neocomplete#smart_close_popup() endif else return "\" endif endfunction " close popup and save indent or expand snippet imap CleverCr() " , : close popup and delete backword char. inoremap neocomplete#smart_close_popup()."\" inoremap neocomplete#smart_close_popup() endif " : completion. inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" " Courtesy of Matteo Cavalleri function! CleverTab() if pumvisible() return "\" endif let substr = strpart(getline('.'), 0, col('.') - 1) let substr = matchstr(substr, '[^ \t]*$') if strlen(substr) == 0 " nothing to match on empty string return "\" else " existing text matching if neosnippet#expandable_or_jumpable() return "\(neosnippet_expand_or_jump)" else return neocomplete#start_manual_complete() endif endif endfunction imap CleverTab() " } " Enable heavy omni completion. if !exists('g:neocomplete#sources#omni#input_patterns') let g:neocomplete#sources#omni#input_patterns = {} endif let g:neocomplete#sources#omni#input_patterns.php = '[^. \t]->\h\w*\|\h\w*::' let g:neocomplete#sources#omni#input_patterns.perl = '\h\w*->\h\w*\|\h\w*::' let g:neocomplete#sources#omni#input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)' let g:neocomplete#sources#omni#input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::' let g:neocomplete#sources#omni#input_patterns.ruby = '[^. *\t]\.\h\w*\|\h\w*::' " } " neocomplcache { elseif count(g:spf13_bundle_groups, 'neocomplcache') let g:acp_enableAtStartup = 0 let g:neocomplcache_enable_at_startup = 1 let g:neocomplcache_enable_camel_case_completion = 1 let g:neocomplcache_enable_smart_case = 1 let g:neocomplcache_enable_underbar_completion = 1 let g:neocomplcache_enable_auto_delimiter = 1 let g:neocomplcache_max_list = 15 let g:neocomplcache_force_overwrite_completefunc = 1 " Define dictionary. let g:neocomplcache_dictionary_filetype_lists = { \ 'default' : '', \ 'vimshell' : $HOME.'/.vimshell_hist', \ 'scheme' : $HOME.'/.gosh_completions' \ } " Define keyword. if !exists('g:neocomplcache_keyword_patterns') let g:neocomplcache_keyword_patterns = {} endif let g:neocomplcache_keyword_patterns._ = '\h\w*' " Plugin key-mappings { " These two lines conflict with the default digraph mapping of imap (neosnippet_expand_or_jump) smap (neosnippet_expand_or_jump) if exists('g:spf13_noninvasive_completion') inoremap " takes you out of insert mode inoremap pumvisible() ? "\\" : "\" " accepts first, then sends the inoremap pumvisible() ? "\\" : "\" " and cycle like and inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" " Jump up and down the list inoremap pumvisible() ? "\\\" : "\" inoremap pumvisible() ? "\\\" : "\" else imap neosnippet#expandable() ? \ "\(neosnippet_expand_or_jump)" : (pumvisible() ? \ "\" : "\(neosnippet_expand_or_jump)") smap (neosnippet_jump_or_expand) inoremap neocomplcache#undo_completion() inoremap neocomplcache#complete_common_string() "inoremap neocomplcache#complete_common_string() function! CleverCr() if pumvisible() if neosnippet#expandable() let exp = "\(neosnippet_expand)" return exp . neocomplcache#close_popup() else return neocomplcache#close_popup() endif else return "\" endif endfunction " close popup and save indent or expand snippet imap CleverCr() " : close popup " : close popup and save indent. inoremap pumvisible() ? neocomplcache#close_popup()."\" : "\" "inoremap pumvisible() ? neocomplcache#close_popup() : "\" " , : close popup and delete backword char. inoremap neocomplcache#smart_close_popup()."\" inoremap neocomplcache#close_popup() endif " : completion. inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" " } " Enable omni completion. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS autocmd FileType python setlocal omnifunc=pythoncomplete#Complete autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete autocmd FileType haskell setlocal omnifunc=necoghc#omnifunc " Enable heavy omni completion. if !exists('g:neocomplcache_omni_patterns') let g:neocomplcache_omni_patterns = {} endif let g:neocomplcache_omni_patterns.php = '[^. \t]->\h\w*\|\h\w*::' let g:neocomplcache_omni_patterns.perl = '\h\w*->\h\w*\|\h\w*::' let g:neocomplcache_omni_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)' let g:neocomplcache_omni_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::' let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\h\w*\|\h\w*::' let g:neocomplcache_omni_patterns.go = '\h\w*\.\?' " } " Normal Vim omni-completion { " To disable omni complete, add the following to your .vimrc.before.local file: " let g:spf13_no_omni_complete = 1 elseif !exists('g:spf13_no_omni_complete') " Enable omni-completion. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS autocmd FileType python setlocal omnifunc=pythoncomplete#Complete autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete autocmd FileType haskell setlocal omnifunc=necoghc#omnifunc endif " } " Snippets { if count(g:spf13_bundle_groups, 'neocomplcache') || \ count(g:spf13_bundle_groups, 'neocomplete') " Use honza's snippets. let g:neosnippet#snippets_directory='~/.vim/bundle/vim-snippets/snippets' " Enable neosnippet snipmate compatibility mode let g:neosnippet#enable_snipmate_compatibility = 1 " For snippet_complete marker. if !exists("g:spf13_no_conceal") if has('conceal') set conceallevel=2 concealcursor=i endif endif " Enable neosnippets when using go let g:go_snippet_engine = "neosnippet" " Disable the neosnippet preview candidate window " When enabled, there can be too much visual noise " especially when splits are used. set completeopt-=preview endif " } " FIXME: Isn't this for Syntastic to handle? " Haskell post write lint and check with ghcmod " $ `cabal install ghcmod` if missing and ensure " ~/.cabal/bin is in your $PATH. if !executable("ghcmod") autocmd BufWritePost *.hs GhcModCheckAndLintAsync endif " UndoTree { if isdirectory(expand("~/.vim/bundle/undotree/")) nnoremap u :UndotreeToggle " If undotree is opened, it is likely one wants to interact with it. let g:undotree_SetFocusWhenToggle=1 endif " } " indent_guides { if isdirectory(expand("~/.vim/bundle/vim-indent-guides/")) let g:indent_guides_start_level = 2 let g:indent_guides_guide_size = 1 let g:indent_guides_enable_on_vim_startup = 1 endif " } " Wildfire { let g:wildfire_objects = { \ "*" : ["i'", 'i"', "i)", "i]", "i}", "ip"], \ "html,xml" : ["at"], \ } " } " vim-airline { " Set configuration options for the statusline plugin vim-airline. " Use the powerline theme and optionally enable powerline symbols. " To use the symbols , , , , , , and .in the statusline " segments add the following to your .vimrc.before.local file: " let g:airline_powerline_fonts=1 " If the previous symbols do not render for you then install a " powerline enabled font. " See `:echo g:airline_theme_map` for some more choices " Default in terminal vim is 'dark' if isdirectory(expand("~/.vim/bundle/vim-airline-themes/")) if !exists('g:airline_theme') let g:airline_theme = 'solarized' endif if !exists('g:airline_powerline_fonts') " Use the default set of separators with a few customizations let g:airline_left_sep='›' " Slightly fancier than '>' let g:airline_right_sep='‹' " Slightly fancier than '<' endif endif " } " } " GUI Settings { " GVIM- (here instead of .gvimrc) if has('gui_running') set guioptions-=T " Remove the toolbar set lines=40 " 40 lines of text instead of 24 if !exists("g:spf13_no_big_font") if LINUX() && has("gui_running") set guifont=Andale\ Mono\ Regular\ 12,Menlo\ Regular\ 11,Consolas\ Regular\ 12,Courier\ New\ Regular\ 14 elseif OSX() && has("gui_running") set guifont=Andale\ Mono\ Regular:h12,Menlo\ Regular:h11,Consolas\ Regular:h12,Courier\ New\ Regular:h14 elseif WINDOWS() && has("gui_running") set guifont=Andale_Mono:h10,Menlo:h10,Consolas:h10,Courier_New:h10 endif endif else if &term == 'xterm' || &term == 'screen' set t_Co=256 " Enable 256 colors to stop the CSApprox warning and make xterm vim shine endif "set term=builtin_ansi " Make arrow and other keys work endif " } " Functions { " Initialize directories { function! InitializeDirectories() let parent = $HOME let prefix = 'vim' let dir_list = { \ 'backup': 'backupdir', \ 'views': 'viewdir', \ 'swap': 'directory' } if has('persistent_undo') let dir_list['undo'] = 'undodir' endif " To specify a different directory in which to place the vimbackup, " vimviews, vimundo, and vimswap files/directories, add the following to " your .vimrc.before.local file: " let g:spf13_consolidated_directory = " eg: let g:spf13_consolidated_directory = $HOME . '/.vim/' if exists('g:spf13_consolidated_directory') let common_dir = g:spf13_consolidated_directory . prefix else let common_dir = parent . '/.' . prefix endif for [dirname, settingname] in items(dir_list) let directory = common_dir . dirname . '/' if exists("*mkdir") if !isdirectory(directory) call mkdir(directory) endif endif if !isdirectory(directory) echo "Warning: Unable to create backup directory: " . directory echo "Try: mkdir -p " . directory else let directory = substitute(directory, " ", "\\\\ ", "g") exec "set " . settingname . "=" . directory endif endfor endfunction call InitializeDirectories() " } " Initialize NERDTree as needed { function! NERDTreeInitAsNeeded() redir => bufoutput buffers! redir END let idx = stridx(bufoutput, "NERD_tree") if idx > -1 NERDTreeMirror NERDTreeFind wincmd l endif endfunction " } " Strip whitespace { function! StripTrailingWhitespace() " Preparation: save last search, and cursor position. let _s=@/ let l = line(".") let c = col(".") " do the business: %s/\s\+$//e " clean up: restore previous search history, and cursor position let @/=_s call cursor(l, c) endfunction " } " Shell command { function! s:RunShellCommand(cmdline) botright new setlocal buftype=nofile setlocal bufhidden=delete setlocal nobuflisted setlocal noswapfile setlocal nowrap setlocal filetype=shell setlocal syntax=shell call setline(1, a:cmdline) call setline(2, substitute(a:cmdline, '.', '=', 'g')) execute 'silent $read !' . escape(a:cmdline, '%#') setlocal nomodifiable 1 endfunction command! -complete=file -nargs=+ Shell call s:RunShellCommand() " e.g. Grep current file for : Shell grep -Hn % " } function! s:IsSpf13Fork() let s:is_fork = 0 let s:fork_files = ["~/.vimrc.fork", "~/.vimrc.before.fork", "~/.vimrc.bundles.fork"] for fork_file in s:fork_files if filereadable(expand(fork_file, ":p")) let s:is_fork = 1 break endif endfor return s:is_fork endfunction function! s:ExpandFilenameAndExecute(command, file) execute a:command . " " . expand(a:file, ":p") endfunction function! s:EditSpf13Config() call ExpandFilenameAndExecute("tabedit", "~/.vimrc") call ExpandFilenameAndExecute("vsplit", "~/.vimrc.before") call ExpandFilenameAndExecute("vsplit", "~/.vimrc.bundles") execute bufwinnr(".vimrc") . "wincmd w" call ExpandFilenameAndExecute("split", "~/.vimrc.local") wincmd l call ExpandFilenameAndExecute("split", "~/.vimrc.before.local") wincmd l call ExpandFilenameAndExecute("split", "~/.vimrc.bundles.local") if IsSpf13Fork() execute bufwinnr(".vimrc") . "wincmd w" call ExpandFilenameAndExecute("split", "~/.vimrc.fork") wincmd l call ExpandFilenameAndExecute("split", "~/.vimrc.before.fork") wincmd l call ExpandFilenameAndExecute("split", "~/.vimrc.bundles.fork") endif execute bufwinnr(".vimrc.local") . "wincmd w" endfunction execute "noremap " . s:spf13_edit_config_mapping " :call EditSpf13Config()" execute "noremap " . s:spf13_apply_config_mapping . " :source ~/.vimrc" " } " Use fork vimrc if available { if filereadable(expand("~/.vimrc.fork")) source ~/.vimrc.fork endif " } " Use local vimrc if available { if filereadable(expand("~/.vimrc.local")) source ~/.vimrc.local endif " } " Use local gvimrc if available and gui is running { if has('gui_running') if filereadable(expand("~/.gvimrc.local")) source ~/.gvimrc.local endif endif " }