" 01 important
" 02 moving around, searching and patterns
" 03 tags
" 04 displaying text
" 05 syntax, highlighting and spelling
" 06 multiple windows
" 07 multiple tab pages
" 08 terminal
" 09 using the mouse
" 10 printing
" 11 messages and info
" 12 selecting text
" 13 editing text
" 14 tabs and indenting
" 15 folding
" 16 diff mode
" 17 mapping
" 18 reading and writing files
" 19 the swap file
" 20 command line editing
" 21 executing external commands
" 22 running make and jumping to errors
" 23 language specific
" 24 multi-byte characters
" 25 various

set nocompatible

" setup of vundle
filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
Bundle 'gmarik/vundle'

" solarized color theme
Bundle 'altercation/vim-colors-solarized'

" monokai color theme
Bundle 'sickill/vim-monokai'

" display the undo history in a graph
Bundle 'mbbill/undotree'

" tree explorer plugin
Bundle 'scrooloose/nerdtree'

" quoting/parenthesizing made simple
Bundle 'tpope/vim-surround'

" better commenting
Bundle 'tpope/vim-commentary'

" nice auto completion
Bundle 'Valloric/YouCompleteMe'

" nice text alignment
Bundle 'godlygeek/tabular'

" status line plugin
Bundle 'bling/vim-airline'

" date/time support for CTRL-x and CTRL-a
Bundle 'tpope/vim-speeddating'

" git integration
Bundle 'tpope/vim-fugitive'

" buffer expolorer
"Bundle 'fholgado/minibufexpl.vim'

" shows a code outline
Bundle 'majutsushi/tagbar'

" python specific stuff
Bundle 'klen/python-mode'

" incremental visual mode
Bundle 'terryma/vim-expand-region'

" splitting single line code
Bundle 'AndrewRadev/splitjoin.vim'

" motion to two characters
Bundle 'justinmk/vim-sneak'

" alignment operator
Bundle 'tommcdo/vim-lion'

Bundle 'wincent/Command-T'

Bundle 'sjl/gundo.vim'

Bundle 'kien/ctrlp.vim'

Bundle 'PeterRincker/vim-argumentative'

Bundle 'wellle/targets.vim'

Bundle 'Lokaltog/vim-easymotion'

Bundle 'terryma/vim-multiple-cursors'

Bundle 'flazz/vim-colorschemes'

set t_Co=256

" setup for pymode
let g:pymode_trim_whitespaces = 1
let g:pymode_lint_on_write = 0
let g:pymode_lint_unmodified = 0
let g:pymode_lint_on_fly = 0
let g:pymoe_rope = 0
let g:pymode_rope_completion = 0
"let g:pymode_rope_completion_on_dot = 1
let g:pymode_rope_goto_definition_cmd = "new"
let g:pymode_syntax_all = 1
let g:pymode_options = 1


" setup for the solarized color theme
set background=dark
let g:solarized_termcolors=16
let g:solarized_termtrans=1
let g:solarized_contrast="normal"
let g:solarized_visibility="normal"
syntax enable
colorscheme monokai

filetype plugin indent on

" setup for vim-airline
let g:airline_theme='powerlineish'
let g:airline_left_sep=''
let g:airline_right_sep=''
"let g:airline_section_z=''

" enable tabline at the top showing all buffers
"let g:airline#extensions#tabline#enabled = 1

let g:ycm_complete_in_comments = 0
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 0 
let g:ycm_seed_identifiers_with_syntax = 1
let g:ycm_add_preview_to_completeopt = 1
let g:ycm_autoclose_preview_window_after_completion = 1 
let g:ycm_autoclose_preview_window_after_insertion = 1

set colorcolumn=79
"set clipboard=unnamed               " enable copying into the clipboard


set esckeys                         " enable cursor keys in insert mode
set ttimeoutlen=50

set modeline                        " respect modelines in files
set modelines=4

set laststatus=2                    " always show a status line

"set nostartofline                   " do not reset the cursor into the first
"                                    " column when moving

set shortmess=rti                   " shorten some messages

set mouse=a                         " enable mouse support
set mousehide                       " hide the mouse when typing

set history=1000                    " history length for commands, defaults to
                                    " 20

set nobackup                        " do not create a backup
set nowritebackup


set noshowmode                      " do not show the current mode, as this
                                    " will be handled by vim-airline in the
                                    " statusline
set cursorline                      " highlight the current line
set number                          " enable linenumbers
set numberwidth=2                   " only use as many columns for the line
                                    " numbers as necessary
set relativenumber                  " show file numbers relative to the current
                                    " line instead of absolute ones, but still
                                    " the absolute linenumber on the current
                                    " line due to 'number' being set
set showmatch                       " show matching brackets/parentheses
set incsearch                       " show matches while typing in a search
set hlsearch                        " highlight matches in a search
set wrapscan                        " wrap searches at the end of the file

set ignorecase                      " ignore case when only searching for
                                    " lowercase
set smartcase                       " letters, case sensitive otherwis

set foldenable                      " auto-fold code

set wrap                            " wrap text
set linebreak

set backspace=indent,eol,start      " allowing backspacing over autoindent,
                                    " line breaks and start of insert

set encoding=utf-8                  " set the encoding


set showmode                        " show current mode in the status line

set swapfile                        " use a swapfile
set directory=/var/tmp,/tmp
set updatecount=200                 " default, number of characters that have
                                    " to be typed before the swapfile is
                                    " written to disk
set updatetime=10000                " time in milliseconds after the swapfile
                                    " is written to disk

set title                           " let vim set the title of the window
set titlestring=""                  " use default titlestring

set autoread                        " automatically reload a file when it was
                                    " changed outside of vim

set gdefault                        " apply replace patterns to the whole line
                                    " by default

set tabstop=4                       " one tab equals 4 spaces
set softtabstop=4                   " makes the spaces feel like real tabs
set shiftwidth=4                    " one indent level equals 4 spaces
set expandtab                       " expand tabs to spaces
set autoindent                      " copy indent from current line when
                                    " starting a new one
set smarttab                        " use shiftwidth when tabbing in front of
                                    " a line instead of tabsstop/softtabstop
set shiftround                      " round indent to multiples of shiftwidth

set undofile                        " use an undo file
set undodir=~/.vim/undo             " store undo files in a fixed directory
                                    " instead of the current directory
set undolevels=1000                 " undo a maximum of 1000 changes
set undoreload=10000                " save the whole buffer for undo when
                                    " reloading it


set foldmethod=indent               " fold according to indet
set foldnestmax=2                   " fold a maximum of 2 levels
set nofoldenable                    " unfold everything by default

set scrolloff=5                     " show context at the screen edges


set showcmd                         " show (partial) command in the command line
set hidden                          " buffers can exist without a window

set ttyfast                         " enhance smoothness
set ruler                           " show position in status line

set wildmenu                        " show a menu when autocompleting
set wildmode=list:longest           " automatically complete up to the level
                                    " of ambiguity

set autochdir                       " automatically change to the directory that
                                    " contains the file that is edited

set matchpairs="(:),{:},[:]"        " matching pairs for the '%'-command

set notildeop                       " do not make '~' behave like an operator

set virtualedit+="block"            " allow moving the cursor where there is no
                                    " actual character in virtual block mode

set wildignore=*.swp,*.bak,*.pyc    " files to ignore when expanding wildcards

set noerrorbells                    " do not beep on errors

set colorcolumn=80                  " highlight the 80st column

"set list                            " show specific spectial characters
"set listchars=                      " no trailing whitespace as '~'

let mapleader = "\<Space>"
nnoremap <Leader>w :w<CR>

vmap <Leader>y "+y
vmap <Leader>d "+d
nmap <Leader>p "+p
nmap <Leader>P "+P
vmap <Leader>p "+p
vmap <Leader>P "+P

nmap <Leader><Leader> za

map , :

vmap v <Plug>(expand_region_expand)
vmap <C-v> <Plug>(expand_region_shrink)

vnoremap <silent> y y`]
vnoremap <silent> p p`]
nnoremap <silent> p p`]


" enable 'very-magic' in regex
"nnoremap / /\v
"vnoremap / /\v

nnoremap <leader>, :nohlsearch<CR>

noremap gV `[v`]

" make Y behave like other capitals, otherwise Y would work like yy
nnoremap Y y$

nnoremap j gj
nnoremap k gk

"function! TrimWhiteSpace()
"     %s/\s\+$//e
"endfunction

" automatically reload .vimrc when it's saved
autocmd BufWritePost .vimrc source ~/.vimrc

"autocmd FileWritePre    * :call TrimWhiteSpace()
"autocmd FileAppendPre   * :call TrimWhiteSpace()
"autocmd FilterWritePre  * :call TrimWhiteSpace()
"autocmd BufWritePre     * :call TrimWhiteSpace()

" Start NERDTree when starting vim
"autocmd vimenter * NERDTree
"autocmd VimEnter * wincmd p
let NERDTreeQuitOnOpen = 1
" close NERDTree when it's the only window left
"autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif

"call togglebg#map("<F5>")

nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

nnoremap <F3> :NERDTreeToggle<CR>
nnoremap <F4> :TagbarToggle<CR>


" Autosave views when closing and restoring when opening again.
autocmd BufWinLeave *.* mkview
autocmd BufWinEnter *.* silent loadview

":inoremap <expr> <CR> pumvisible() ? '<C-e><CR>' : '<CR>'

":au WinEnter * :setlocal number relativenumber
":au WinLeave * :setlocal nonumber norelativenumber

nnoremap <up>    <nop>
nnoremap <down>  <nop>
nnoremap <left>  <nop>
nnoremap <right> <nop>
inoremap <up>    <nop>
inoremap <down>  <nop>
inoremap <left>  <nop>
inoremap <right> <nop>

inoremap jj <ESC>

nnoremap <leader>v <C-w>v<C-w>l

" no more ex mode
nnoremap Q <nop>

nnoremap <leader>r :%s///<Left><Left>

set virtualedit="onemore,all"

autocmd BufWritePre *.rst silent :%s/\s\+$//e
