" PLUGINS
call plug#begin('~/.vim/plugged')

" colors
Plug 'alessandroyorba/alduin'
Plug 'nanotech/jellybeans.vim'

" keepers
Plug 'airblade/vim-gitgutter'
Plug 'atomaka/ZoomWin'            " vim-scripts not up to date
Plug 'bronson/vim-trailing-whitespace'
Plug 'ctrlpvim/ctrlp.vim'
Plug 'rbgrouleff/bclose.vim'
Plug 'tpope/vim-endwise'
Plug 'tpope/vim-eunuch'
Plug 'tpope/vim-git'
Plug 'tpope/vim-surround'

" languages
Plug 'fatih/vim-go'
Plug 'posva/vim-vue'
Plug 'tpope/vim-markdown'
Plug 'tpope/vim-rails'
Plug 'vim-ruby/vim-ruby'

" maybe
Plug 'tommcdo/vim-lion'
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-repeat'

call plug#end()
filetype plugin indent on

" STATUS LINE
set statusline=%<\ %f%{ZoomState()}\ %m%r%y%w%=\ Line:\ %l\/%L\ [%p%%]\ Col:\ %c\ Buf:\ #%n\ 

" OPTIONS
set fileformats=unix,mac,dos      " File format prefer unix endings
set endofline                     " Add newline at end of file
set shellslash                    " Forward slashes
set nobackup                      " No backup files
set noswapfile                    " Hope for the best
set formatoptions=crq
set textwidth=80
set cpoptions+=$                  " delimit end of change text
set laststatus=2                  " Always show status line
set showmode                      " Show current mode
set history=100                   " History length
set cursorline                    " Highlight current line
set cursorcolumn                  " Highlight current column
set nowrap                        " Disable wrapping by default
set backspace=2                   " Backspace over indent, eol, start of insert
set hlsearch                      " Search highlights
set wrapscan                      " Wrapped search
set incsearch                     " Search as you type
set ignorecase                    " Ignore case with search
set smartcase                     " Search will not ignore uppercase
set showcmd                       " Show command as you type
set ruler                         " Show cursor position
set autoindent                    " autoindent AND be smart about it
set smartindent
set colorcolumn=80                " Ruler at line 80
set nomodeline
set relativenumber                " Relative line numbers
set number
set virtualedit=all               " Cursor can go anywhere
set scrolloff=3                   " Keep cursor from touching edges
set timeoutlen=500                " Don't wait too long (ambiguous leaders)
set showmatch                     " Show matching brackets
set hidden                        " Allow unsaved buffers to be hidden
set wildcharm=<tab>               " Allow use of tab in macros
set wildmenu                      " Command line completion
set wildmode=list:longest,full    " Better file completion
set infercase                     " Adjust completions to match case
set wildignorecase                " Ignore case on commandline
set autowrite                     " Save file when focus is lost
set updatetime=250                " Make gitgutter autoupdate
" Tabs are 2 spaces
set tabstop=2
set softtabstop=2
set shiftwidth=2
set expandtab
set shiftround                    " make >> go to next tab
" some performance stuff
set lazyredraw
set ttyfast
set synmaxcol=256
" Show whitespace markers before cursor in insert mode
set list listchars=tab:\ \ ,trail:ยท
" Ignore stuff
set wildignore+=*/\.git/*
" Java
set wildignore+=*/build/*,*/grade/*,*\.class
" Frontend
set wildignore+=*/node_modules/*,*/bower_components/*,*/dist/*
" Persistent undo stuff
if has('persistent_undo')
  set undolevels=5000
  set undodir=$HOME/.vim/undo
  set undofile
endif

" KEYBINDS
" quick replaceement
nmap S :%s//g<LEFT><LEFT>

" consistency is key - Y should act like C, D
map Y y$

" Don't cancel visual mode while indenting
vnoremap > >gv
vnoremap < <gv

" ZoomWin
nmap <c-w>z <Plug>ZoomWin

" LEADERS
let mapleader = ","

" tab swaps
map <Leader>2 :set tabstop=2 softtabstop=2 shiftwidth=2 expandtab<cr>
map <Leader>4 :set tabstop=4 softtabstop=4 shiftwidth=4 expandtab<cr>
map <Leader>a :set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab<cr>

" plugin
map <Leader>pc :PlugClean<cr>
map <Leader>pi :PlugInstall<cr>
map <Leader>pu :PlugUpdate<cr>

" clear search
map <Leader>cs :let @/ = ""<cr>

" bclose
nnoremap <silent> <Leader>bd :Bclose<CR>
nnoremap <silent> <Leader>bD :Bclose!<CR>
nnoremap <silent> <Leader>BD :Bclose!<CR>

" other
map <Leader>fj :%!python -m json.tool<cr>
map <Leader>fw :FixWhitespace<cr>
map <Leader>pm :set paste!<cr>
map <Leader>sa :Move %<tab>
map <Leader>se :e ~/.vimrc<cr>
map <Leader>sc :pclose<cr>
map <Leader>sw :SudoWrite<cr>
map <Leader>sz :so ~/.vimrc<cr>

" PLUGIN CONFIGURATION
" style
colorscheme jellybeans
syntax enable

highlight ColorColumn ctermbg=236
highlight CursorColumn ctermbg=236
highlight CursorLine ctermbg=236

" go
let g:go_fmt_command = "goimports"

" ZoomWin
function! ZWStatline(state)
  if a:state
    let t:zoomed = 1
  else
    let t:zoomed = 0
  endif
endfunction
if !exists("g:ZoomWin_funcref")
 let g:ZoomWin_funcref= function("ZWStatline")
endif

function! ZoomState()
  if exists('t:zoomed') && t:zoomed
    return 'Z'
  else
    return ''
  endif
endfunction