Skip to content

Instantly share code, notes, and snippets.

Forked from millermedeiros/.vimrc
Created Dec 8, 2018
What would you like to do?
My VIM settings (.vimrc)
" =============================================================================
" Miller Medeiros .vimrc file
" -----------------------------------------------------------------------------
" heavily inspired by: @factorylabs, @scrooloose, @nvie, @gf3, @bit-theory.
" =============================================================================
" -----------------------------------------------------------------------------
" -----------------------------------------------------------------------------
set nocompatible " Disable vi compatibility
filetype on " filetype must be 'on' before setting it 'off'
" otherwise it exits with a bad status and breaks
" git commit.
filetype off " force reloading *after* pathogen loaded
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
Plugin 'wincent/Command-T'
Plugin 'vim-scripts/IndentAnything'
Plugin 'vim-scripts/IndexedSearch'
Plugin 'vim-scripts/LustyJuggler'
Plugin 'gregsexton/MatchTag'
Plugin 'vim-scripts/YankRing.vim'
Plugin 'mileszs/ack.vim'
Plugin 'vim-scripts/bufkill.vim'
Plugin 'editorconfig/editorconfig-vim'
Plugin 'sjl/gundo.vim'
Plugin 'sjl/clam.vim'
Plugin 'othree/html5.vim'
Plugin 'scrooloose/nerdcommenter'
Plugin 'scrooloose/nerdtree'
Plugin 'junkblocker/patchreview-vim'
Plugin 'ervandew/supertab'
Plugin 'scrooloose/syntastic'
Plugin 'godlygeek/tabular'
Plugin 'Lokaltog/vim-easymotion'
Plugin 'tpope/vim-repeat'
Plugin 'tpope/vim-abolish'
Plugin 'tpope/vim-fugitive'
Plugin 'tpope/vim-markdown'
Plugin 'tpope/vim-speeddating'
Plugin 'tpope/vim-surround'
Plugin 'tpope/vim-unimpaired'
Plugin 'mhinz/vim-signify'
Plugin 'int3/vim-extradite'
" css
Plugin 'ap/vim-css-color'
Plugin 'hail2u/vim-css3-syntax'
" js
Plugin 'pangloss/vim-javascript'
Plugin 'elzr/vim-json'
Plugin 'mxw/vim-jsx'
Plugin 'millermedeiros/vim-esformatter'
" Bundle 'marijnh/tern_for_vim'
" snipmate
Plugin 'MarcWeber/vim-addon-mw-utils'
Plugin 'tomtom/tlib_vim'
Plugin 'garbas/vim-snipmate'
Plugin 'honza/vim-snippets'
Plugin 'millermedeiros/vim-statline'
" Plugin 'bling/vim-airline'
" colorschemes
Plugin 'tomasr/molokai'
" required for vundle
call vundle#end()
syntax on
filetype plugin indent on " enable detection, plugins and indent
" Local dirs (centralize everything)
set backupdir=~/.vim/backups
set directory=~/.vim/swaps
" Change mapleader (easier to type), at the top since its used everywhere
let mapleader=","
let maplocalleader=";"
set spelllang=en_us " spell checking
set encoding=utf-8 nobomb " BOM often causes trouble, UTF-8 is awsum.
" --- performance / buffer ---
set hidden " can put buffer to the background without writing
" to disk, will remember history/marks.
set lazyredraw " don't update the display while executing macros
set ttyfast " Send more characters at a given time.
" --- history / file handling ---
set history=999 " Increase history (default = 20)
set undolevels=999 " Moar undo (default=100)
set autoread " reload files if changed externally
" --- backup and swap files ---
" I save all the time, those are annoying and unnecessary...
set nobackup
set nowritebackup
set noswapfile
" --- search / regexp ---
set gdefault " RegExp global by default
set magic " Enable extended regexes.
set hlsearch " highlight searches
set incsearch " show the `best match so far' astyped
set ignorecase smartcase " make searches case-insensitive, unless they
" contain upper-case letters
" --- keys ---
set backspace=indent,eol,start " allow backspacing over everything.
set esckeys " Allow cursor keys in insert mode.
set nostartofline " Make j/k respect the columns
" set virtualedit=all " allow the cursor to go in to 'invalid' places
set timeoutlen=500 " how long it wait for mapped commands
set ttimeoutlen=100 " faster timeout for escape key and others
" Use a bar-shaped cursor for insert mode, even through tmux.
if exists('$TMUX')
let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
" -----------------------------------------------------------------------------
" UI
" -----------------------------------------------------------------------------
set t_Co=256 " 256 colors terminal
let g:molokai_original=0
colorscheme molokai
" make 'var' keyword easier to spot
hi link javascriptType Keyword
" default ColorColumn is too distractive
hi clear ColorColumn
hi link ColorColumn FoldColumn
" defaul line number is too distractive
hi clear LineNr
hi link LineNr Comment
hi link OverLength Error
" --- UI settings ---
if has('gui_running')
"set guifont=Menlo:h13
set gfn:Monaco:h14
set transp=0
" toolbar and scrollbars
set guioptions-=T " remove toolbar
set guioptions-=L " left scroll bar
set guioptions-=r " right scroll bar
set guioptions-=b " bottom scroll bar
set guioptions-=h " only calculate bottom scroll size of current line
set shortmess=atI " Don't show the intro message at start and
" truncate msgs (avoid press ENTER msgs).
set cursorline " Highlight current line
set laststatus=2 " Always show status line
set number " Enable line numbers.
set numberwidth=5 " width of numbers line (default on gvim is 4)
set report=0 " Show all changes.
set showmode " Show the current mode.
set showcmd " show partial command on last line of screen.
set showmatch " show matching parenthesis
set splitbelow splitright " how to split new windows.
set title " Show the filename in the window title bar.
set scrolloff=5 " Start scrolling n lines before horizontal
" border of window.
set sidescrolloff=7 " Start scrolling n chars before end of screen.
set sidescroll=1 " The minimal number of columns to scroll
" horizontally.
" add useful stuff to title bar (file name, flags, cwd)
" based on @factorylabs
if has('title') && (has('gui_running') || &title)
set titlestring=
set titlestring+=%f
set titlestring+=%h%m%r%w
set titlestring+=\ -\ %{v:progname}
set titlestring+=\ -\ %{substitute(getcwd(),\ $HOME,\ '~',\ '')}
" use relative line number by default
if exists('+relativenumber')
set relativenumber
" --- command completion ---
set wildmenu " Hitting TAB in command mode will
set wildchar=<TAB> " show possible completions.
set wildmode=list:longest
set wildignore+=*.DS_STORE,*.db,node_modules/**,*.jpg,*.png,*.gif
" --- diff ---
set diffopt=filler " Add vertical spaces to keep right
" and left aligned.
set diffopt+=iwhite " Ignore whitespace changes.
" --- folding---
set foldmethod=manual " manual fold
set foldnestmax=3 " deepest fold is 3 levels
set nofoldenable " don't fold by default
" --- list chars ---
" list spaces and tabs to avoid trailing spaces and mixed indentation
" see key mapping at the end of file to toggle `list`
set listchars=tab:▹\ ,trail:·,nbsp:⚋
set fillchars=fold:-
set list
" --- remove sounds effects ---
set noerrorbells
set visualbell
" -----------------------------------------------------------------------------
" -----------------------------------------------------------------------------
set expandtab " Expand tabs to spaces
set autoindent smartindent " auto/smart indent
set copyindent " copy previous indentation on auto indent
set softtabstop=2 " Tab key results in # spaces
set tabstop=2 " Tab is # spaces
set shiftwidth=2 " The # of spaces for indenting.
set smarttab " At start of line, <Tab> inserts shift width
" spaces, <Bs> deletes shift width spaces.
set wrap " wrap lines
set textwidth=80
"set colorcolumn=+1 " Show large lines
set formatoptions=qrn1 " automatic formating.
set formatoptions-=o " don't start new lines w/ comment leader on
" pressing 'o'
set nomodeline " don't use modeline (security)
set pastetoggle=<leader>p " paste mode: avoid auto indent, treat chars
" as literal.
" -----------------------------------------------------------------------------
" -----------------------------------------------------------------------------
" --- NERDTree ----
let NERDTreeIgnore=['.DS_Store']
let NERDTreeShowBookmarks=0 "show bookmarks on startup
let NERDTreeHighlightCursorline=1 "Highlight the selected entry in the tree
let NERDTreeShowLineNumbers=0
let NERDTreeMinimalUI=1
noremap <leader>nt :NERDTreeToggle<CR>
" --- NERDCommenter ---
let NERDSpaceDelims=1 " space around delimiters
let NERDRemoveExtraSpaces=1
let g:NERDCustomDelimiters = {
\ 'scss': { 'left': '//' }
\ }
" --- Syntastic : Linting / Error check ---
let g:syntastic_auto_loc_list=2
let g:syntastic_check_on_open=1
" close/open location list (errors)
noremap <silent><leader>lc :lcl<CR>
noremap <silent><leader>lo :Errors<CR> :lw<CR>
noremap <silent><leader>ln :lnext<CR>
noremap <silent><leader>lp :lprev<CR>
" --- autocomplete / supertab / jscomplete ---
set infercase
set completeopt=longest,menuone
set omnifunc=syntaxcomplete#Complete
set completefunc=syntaxcomplete#Complete
set complete=.,w,b,u,U,t,i,d
" see [autocommands] at the end for more autocomplete settings
" nodejs-complete / jscomplete
let g:node_usejscomplete = 1
let g:jscomplete_use = ['dom', 'moz']
let g:SuperTabMappingForward = '<c-space>'
let g:SuperTabMappingBackward = '<s-c-Space>'
let g:SuperTabLongestEnhanced = 1
let g:SuperTabDefaultCompletionType = "<c-p>"
" --- snipmate ---
let g:snips_author = 'Miller Medeiros'
" --- EasyMotion ---
let g:EasyMotion_leader_key = '<Leader>m'
" lets make <leader>F and <leader>f use easymotion by default
let g:EasyMotion_mapping_f = '<leader>f'
let g:EasyMotion_mapping_F = '<leader>F'
" --- Strip trailing whitespace ---
function! StripWhitespace ()
let save_cursor = getpos(".")
let old_query = getreg('/')
call setpos('.', save_cursor)
call setreg('/', old_query)
" Trailing white space (strip spaces)
noremap <leader>ss :call StripWhitespace()<CR>
" --- matchit ---
runtime macros/matchit.vim " enable matchit (better '%' key mapping)
" --- vim-css-color ---
let g:cssColorVimDoNotMessMyUpdatetime = 1
" --- vim-signify ---
let g:signify_update_on_focusgained = 1
" --- Command-T ---
let g:CommandTMaxFiles=2000
let g:CommandTMaxHeight=12
noremap <silent> <leader>tt :CommandT<CR>
noremap <silent> <leader>bt :CommandTBuffer<CR>
noremap <silent> <leader>tf :CommandTFlush<CR>
" --- LustyJuggler ---
let g:LustyJugglerSuppressRubyWarning = 1 " avoid error if running on terminal
" --- statline ---
" errors color
hi User3 guifg=#FFFFFF guibg=#FF0000 gui=bold ctermfg=15 ctermbg=1 cterm=bold
let g:statline_fugitive = 1
let g:statline_filename_relative = 1
let g:statline_mixed_indent_string = '[mix]'
" --- gundo ---
nnoremap <leader>gu :GundoToggle<CR>
let g:gundo_right = 1
let g:gundo_preview_bottom = 1
" --- toggle indentation mode ---
function! ToggleExpandTab()
if &et
set noet softtabstop=0
execute "set et softtabstop=". &tabstop
noremap <silent> <leader>et :call ToggleExpandTab()<CR>
" --- Show syntax highlighting groups for word under cursor ---
nnoremap <leader>sh :call <SID>SynStack()<CR>
function! <SID>SynStack()
if !exists("*synstack")
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
" faster wehn opening files with large lines
set synmaxcol=300
" --- Highlight word under cursor ---
" hi W1 guibg=#aeee00 guifg=#000000 ctermbg=154 ctermfg=16
" nnoremap <silent> <leader>h1 :execute 'match W1 /\<<c-r><c-w>\>/'<cr>
" --- Tabular.vim ---
noremap <silent> <leader>t: :Tabularize /:<CR>
noremap <silent> <leader>t= :Tabularize /=<CR>
noremap <silent> <leader>t, :Tabularize /,<CR>
noremap <silent> <leader>t{ :Tabularize /{<CR>
noremap <silent> <leader>t" :Tabularize /"<CR>
noremap <silent> <leader>t' :Tabularize /'<CR>
noremap <silent> <leader>t[ :Tabularize /[<CR>
noremap <silent> <leader>t/ :Tabularize ///<CR>
noremap <silent> <leader>t\| :Tabularize /\|<CR>
" --- include content of static files ---
" borrowed from:
function! IncludeStatic()
:g/<!-- #include "[^"]*" -->\_.\{-}<!-- end include -->/let fname = matchstr(getline('.'),'<!-- #include "\zs[^"]*\ze" -->')|exec '+,/<!-- end include -->/-!cat '.fnameescape(fname)
noremap <silent> <leader>ic :call IncludeStatic()<CR>
" --- convert selected text from markdown to HTML ---
vnoremap <silent> <leader>md :! mdown<CR>
function! SanitizeMdown()
%s/<br \?\/\?>/ /
%s/<pre><code>/<pre class="brush:js">\r/
noremap <silent> <leader>mds :call SanitizeMdown()<CR>
" --- format JavaScript source code using esformatter --
nnoremap <silent> <leader>es :Esformatter<CR>
vnoremap <silent> <leader>es :EsformatterVisual<CR>
" --- toggle autocomplete behavior and word delimiters ---
function! KeywordsAll()
setl iskeyword=@,48-57,192-255,\@,\$,%,-,_
function! KeywordsBasic()
setl iskeyword=@,48-57,192-255
" --- visual block move ---
let g:DVB_TrimWS = 1
vmap <expr> <S-LEFT> DVB_Drag('left')
vmap <expr> <S-RIGHT> DVB_Drag('right')
vmap <expr> <S-DOWN> DVB_Drag('down')
vmap <expr> <S-UP> DVB_Drag('up')
vmap <expr> D DVB_Duplicate()
" --- transform lists ---
nmap <leader>ls :call ListTrans_toggle_format()<CR>
vmap <leader>ls :call ListTrans_toggle_format('visual')<CR>
" -----------------------------------------------------------------------------
" -----------------------------------------------------------------------------
" mapleader set at the top of the file to avoid conflicts
" faster commands
" nnoremap <space> :
" sudo write
" command! W w !sudo tee % > /dev/null
" Swap v and CTRL-V, because Block mode is more useful that Visual mode
" nnoremap v <C-V>
" nnoremap <C-V> v
" vnoremap v <C-V>
" vnoremap <C-V> v
" avoid mistyping commands
command! W w
command! Wq wq
command! Bd bd
" Split line (sister to [J]oin lines)
" The normal use of S is covered by cc, so don't worry about shadowing
nnoremap S i<cr><esc><right>
" movement by screen line instead of file line (for text wrap)
nnoremap j gj
nnoremap <down> gj
nnoremap k gk
nnoremap <up> gk
" next tab
nnoremap <C-Tab> :tabn<CR>
" automatic esc, really uncommon to type jj,jk
inoremap jj <ESC>
inoremap jk <Esc>
" Faster scrolling
nnoremap <C-e> 3<C-e>
nnoremap <C-y> 3<C-y>
" Bubble single lines, similar to Eclipse (requires unimpaired.vim)
nmap <C-Up> [e
nmap <C-Down> ]e
" Bubble multiple lines, similar to Eclipse (requires unimpaired.vim)
vmap <C-Up> [egv
vmap <C-Down> ]egv
" Duplicate lines, similar to Eclipse
noremap <C-S-Up> YP
noremap <C-S-Down> YP
" 'fix' search regexp to be compatible with Perl format
" nmap / /\v
" vmap / /\v
" Use the damn hjkl keys
" noremap <up> <nop>
" noremap <down> <nop>
" noremap <left> <nop>
" noremap <right> <nop>
" improve the 'search word under cursor' behavior
nnoremap * :silent call KeywordsAll()<CR> *
nnoremap # :silent call KeywordsAll()<CR> #
" Toggle show tabs and trailing spaces
nnoremap <leader>c :set nolist!<CR>
" Clear the search highlight
nnoremap <silent> \ :silent nohlsearch<CR>
" text wrap: Hard wrap paragraph text (similar to TextMate Ctrl+Q)
nnoremap <leader>tw gqip
nnoremap <leader>nw :set nowrap<CR>
" Open file (useful for HTML)
noremap <silent> <leader>o :!open %<CR>
" Reformat code
nnoremap <leader>rf gg=G
" I use retab too much and it's hard to type
nnoremap <leader>rt :retab!<CR>
" Pull word under cursor into LHS of a substitute (find and replace)
nnoremap <leader>rr :silent call KeywordsAll()<CR> :%s#\<<C-r>=expand("<cword>")<CR>\>#
" Insert/append a single character
" noremap ,, i_<esc>r
" noremap ;; a_<esc>r
" Visually select the text that was last edited/pasted
nnoremap <leader>v `[v`]
" fast Ack
nnoremap <leader>a :tab split<CR>:Ack<Space>
nnoremap <leader>aw :silent call KeywordsAll()<CR> :tab split<CR>:Ack<cword><CR> :silent call KeywordsBasic()<CR>
" Toggle spelling hints
nnoremap <silent> <leader>ts :set spell!<CR>
" Move between splits (windows)
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l
" Move windows around (only works on same row)
noremap <C-S-Right> <C-w>r
noremap <C-S-Left> <C-w>R
" Open current buffer in a new split
noremap <leader>s :vsplit<cr>
noremap <leader>i :split<cr>
" close window
noremap <leader>q :clo<CR>
" delete buffer but keep window open (requires bufkill.vim)
map <leader>bd :BD<CR>
" smarter next/prev buffer (requires bufkill.vim)
map <leader>bn :BF<CR>
map <leader>bp :BB<CR>
" resize splits (
nnoremap <silent> <Leader>+ :exe "resize " . (winheight(0) * 3/2)<CR>
nnoremap <silent> <Leader>- :exe "resize " . (winheight(0) * 2/3)<CR>
" add spaces inside current parenthesis
map <leader>( vi(xi P
" -----------------------------------------------------------------------------
" -----------------------------------------------------------------------------
" [autocommands] borrowed from @bit-theory vimfiles and edited
augroup mm_buf_cmds
" clear commands before resetting
" when vimrc is edited, reload it
autocmd bufwritepost .gvimrc source %
autocmd bufwritepost .vimrc source %
" Only show cursorline in the current window and in normal mode
au WinLeave,InsertEnter * set nocul
au WinEnter,InsertLeave * set cul
" filetype
autocmd BufNewFile,BufRead *.json setf json
autocmd BufNewFile,BufRead *.hx setf haxe
autocmd FileType mustache runtime! ftplugin/html/sparkup.vim
" Enable omnicomplete for supported filetypes
autocmd FileType css,scss setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
" autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
" jscomplete is a separate plugin
autocmd FileType javascript setlocal omnifunc=jscomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags
" make `gf` search for .js files
autocmd FileType javascript setlocal suffixesadd=.js
autocmd FileType javascript setlocal path+=js,scripts
" make sure `complete` works as expected for CSS class names without
" messing with motions (eg. '.foo-bar__baz') and we make sure all
" delimiters (_,-,$,%,.) are treated as word separators outside insert mode
autocmd InsertEnter,BufLeave * :silent call KeywordsAll()
autocmd InsertLeave,BufEnter * :silent call KeywordsBasic()
" yes, we need to duplicate it on VimEnter for some weird reason
autocmd VimEnter * nnoremap * :silent call KeywordsAll()<CR> *
autocmd VimEnter * nnoremap # :silent call KeywordsAll()<CR> #
" Toggle relative/absolute line numbers during edit
" if exists('+relativenumber')
" autocmd InsertEnter * setl nu
" autocmd InsertLeave,BufEnter * setl rnu
" endif
" highlight char at column 81 (textwidth + 1)
autocmd BufEnter * match OverLength /\%81v/
" Color Column (only on insert)
if exists("&colorcolumn")
autocmd InsertEnter * set colorcolumn=80
autocmd InsertLeave * set colorcolumn=""
augroup END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment