set nocompatible " vi improved
filetype off     " do not load Filetype file
set shell=/bin/bash

" Uncomment this when ready for hardcore
for prefix in ['i', 'n', 'v']
 for key in ['<Up>', '<Down>', '<Left>', '<Right>']
    exe prefix . "noremap " . key . " <Nop>"
  endfor
endfor

" ####################
" ### Vundle setup ###
" ####################

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
Bundle 'gmarik/vundle'

" ##############
" ### Colors ###
" ##############

Bundle "daylerees/colour-schemes", { "rtp": "vim-themes/" }
Bundle "chriskempson/tomorrow-theme", { "rtp": "vim/" }

syntax on
filetype plugin on
filetype indent on

colorscheme Peacock

" #################
" ### Powerline ###
" #################

Bundle 'Lokaltog/vim-powerline'
let g:Powerline_symbols = 'compatible' " (compatible, unicode, fancy)
set laststatus=2
set noshowmode

" #################
" ### Nerd Tree ###
" #################

Bundle 'scrooloose/nerdtree'
nmap <C-n> :NERDTreeToggle<CR>
let NERDTreeIgnore=['\.DS_Store$', '\.swp$', '\.git$', '\.bundle$', '\.pyc$']
let NERDTreeHighlightCursorline=1
let NERDTreeShowHidden=1
let NERDTreeMinimalUI=1
let NERDTreeDirArrows=1
let NERDChristmasTree=1
let NERDTreeChDirMode=2
let NERDTreeQuitOnOpen=1
let g:NERDTreeWinSize=50

" ######################
" ### Nerd Commenter ###
" ######################

Bundle 'scrooloose/nerdcommenter'
let g:NERDCreateDefaultMappings=0
let g:NERDCompactSexyComs=1
let g:NERDSpaceDelims=1
nmap <Leader>/ <plug>NERDCommenterToggle
vmap <Leader>/ <plug>NERDCommenterToggle

" #########################
" ### Fuzzy File Search ###
" #########################

Bundle 'kien/ctrlp.vim'
let g:ctrlp_match_window_bottom=0
let g:ctrlp_match_window_reversed=0

" ###########################
" ### Ruby Syntax Support ###
" ###########################

Bundle 'vim-ruby/vim-ruby'

" ###################
" ### Rails Tools ###
" ###################

Bundle 'tpope/vim-rails'

" ###########################
" ### Magic Code Aligning ###
" ###########################

Bundle 'godlygeek/tabular'

" ###################
" ### Git Wrapper ###
" ###################

Bundle 'tpope/vim-fugitive'

" ###################
" ### Preferences ###
" ###################

set encoding=utf-8              " Because
set showmatch                   " Show matching brackets
set backspace=indent,eol,start  " Better backspace support
set history=1000                " Save 1000 commands in history
set undolevels=1000             " Save 1000 commands for undo
set completeopt=longest,menuone " Completion preferences
set complete=.,w,b,kspell,ss    " current buffer, other windows' buffers, dictionary, spelling
set relativenumber              " Show line numbers (relative)
set cursorline                  " Highlight the current line
set tabstop=2                   " Tab size
set shiftwidth=2                " Must be the same
set softtabstop=2               " Must be the same
set expandtab                   " Upaces instead of tabs
set nowrap                      " Wrap lines
set nolinebreak                 " Break lines softly
set wrapscan                    " Wrap search
set incsearch                   " Incremental search
set ignorecase                  " Ignore case when searching
set nohlsearch                  " Don't fucking highlight search
set smartcase                   " Overrides ignore case in case pattern contains upper case char
set nolist                      " Don't show sick characters
set textwidth=120               " Text width before wrap
set t_Co=256                    " Number of terminal colors
set mousehide                   " Hide mouse when typing
set guioptions-=L               " Disable scrollbars
set guioptions-=r               " Disable scrollbars
set wildignore+=*/tmp/*         " Index ignoresa
set gfn=Menlo:h14               " Set font family and size

" ########################
" ### MacVim Specific  ###
" ########################

if has("gui_macvim")
  " Use Mac option key as meta key
  set macmeta
  
  " MacVIM shift+arrow-keys behavior (required in .vimrc)
  let macvim_hig_shift_movement=1
endif

" ################
" ### Triggers ###
" ################

if has("autocmd")
  autocmd FileType ruby,eruby,yaml set ai sw=2 sts=2 et
  autocmd FileType ruby,eruby,yaml setlocal foldmethod=manual
  autocmd User Rails set tabstop=2 shiftwidth=2 softtabstop=2 expandtab

  " When vimrc is edited, reload it
  autocmd! BufWritePost $MYVIMRC source $MYVIMRC

  autocmd FocusLost * :set number
  autocmd FocusGained * :set relativenumber
  autocmd InsertEnter * :set number
  autocmd InsertLeave * :set relativenumber
endif

" ##########################
" ### Follow Your Leader ###
" ##########################

" Set the Leader key to comma instead of backslash
let mapleader = ","

nmap <Leader>v :e $MYVIMRC<CR>

nmap <Leader>s :w<CR>
nmap <Leader>qq :q!<CR>
nmap <Leader>rr :source $MYVIMRC<CR>

nmap <Leader>gu :!git up<CR>
nmap <Leader>mkb :!mkbundle<CR>

" Toggle search highlight
nmap <Leader>h :set hlsearch!<CR>
nmap <Leader>hh :let @/=""<CR>
nmap <Leader>o :set paste!<CR>

" Toggle wrap
nmap <Leader>w :set wrap! list! linebreak!<CR>

" Rails helpers
nmap <Leader>rm :Rmodel 
nmap <Leader>rc :Rcontroller 
nmap <Leader>rs :Rspec 

" Splitting windows iTerm style
nmap <D-d> :vs<CR>
nmap <D-D> :sp<CR>

" Vertical window resizing
map <M-<gt>> :vertical res +1^M<CR>
nmap <M-<lt>> :vertical res -1^M<CR>

" Horizontal window rezising
nmap <M-=> :res +1^M<CR>
nmap <M--> :res -1^M<CR>

" Center line with the find occurance
nmap n nzz
nmap N Nzz

" Siblings
nmap <Leader>ew :e <C-R>=expand("%:p:h")."/"<CR>
nmap <Leader>es :sp <C-R>=expand("%:p:h")."/"<CR>
nmap <Leader>ev :vsp <C-R>=expand("%:p:h")."/"<CR>
nmap <Leader>et :tabedit <C-R>=expand("%:p:h")."/"<CR>

" Convert Ruby 1.8 hash syntax to 1.9
nmap <Leader>r18 :%s/:\(\w\+\)\(\s\+\)=>/\1:\2/ge<CR>

" #######################
" ### Visual Mappings ###
" #######################

" Indentation TextMate style
vmap <D-[> <gv
vmap <D-]> >gv

" Sudo to write
cmap w!! w !sudo tee % >/dev/null

" Centerize current line
nmap j jzz
nmap k kzz
" Move 10 lines with Option key
nmap <Esc>j 10j
nmap <Esc>k 10k

" Insert blank lines without entering insert mode
nnoremap <Leader>j m`o<Esc>``
nnoremap <Leader>k m`O<Esc>``

function! ToggleLineNumbers()
  if (&relativenumber == 1)
    set number
  else
    set relativenumber
  endif
endfunc

function! PreservePosition(command)
  " Preparation: save last search, and cursor position.
  let _s=@/
  let l = line(".")
  let c = col(".")

  " Do the business:
  execute a:command

  " Clean up: restore previous search history, and cursor position
  let @/=_s
  call cursor(l, c)
endfunction

nnoremap <silent> <Leader>n :call ToggleLineNumbers()<CR>