"================================================================================ 
" Vundle: plugin manager...
set nocompatible|               " do not try to be vi, be vim
filetype off|                   " Vundle needs this
set rtp+=~/.vim/plugins/Vundle.vim
call vundle#begin('~/.vim/plugins/')

" Plugin dependant configurations...
Plugin 'VundleVim/Vundle.vim'
Plugin 'cscope_plus.vim'        " run cscope -R -b in project folder then use
Plugin 'autoload_cscope.vim'    " CTRL+\ s searches word under cursor, CTRL+T back
Plugin 'tpope/vim-fugitive'     " the most complete GIT integration plugin
Plugin 'taglist-plus'           " quick code navigator
let Tlist_Compact_Format = 1
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Close_On_Select = 1
Plugin 'Valloric/YouCompleteMe'                                       | " syntax checker and code completion
let g:ycm_global_ycm_extra_conf = '/home/max/.vim/_ycm_extra_conf.py' | " fallback, right one should be in the applications path
let g:ycm_confirm_extra_conf = 0                                      | " disable 'do you really want to execute .py?'
let g:ycm_key_select_completion = '<Tab>'                             | " key completion key
let g:ycm_error_symbol = '✖'                                          | " insert this as an error symbol in the gutter bar
let g:ycm_warning_symbol = '➔'                                        | " insert this as a warning symbol in the gutter bar
let g:ycm_collect_identifiers_from_tags_files = 1                     | " 
let g:ycm_autoclose_preview_window_after_insertion=1                  | " close the window when leaving insert mode
inoremap <buffer> ( <C-X><C-o>(
"if !exists("g:ycm_semantic_triggers")
"   let g:ycm_semantic_triggers = {}
"endif
"let g:ycm_semantic_triggers['c'] = ['(']                             | " 


call vundle#end()             | " required
filetype plugin indent on     | " required

"================================================================================ 
" custom config

set noswapfile                | " noundofile, nobackup, nowritebackup
set backupdir=~/.vim/temp     | " using :set backup will copy current file to this directory
set directory=~/.vim/temp     | " 
set undodir=~/.vim/temp       | " 

set ts=2 sts=2 sw=2 expandtab | " indentation which i like
set autoindent                | " always set autoindenting on
set copyindent                | " copy the previous indentation on autoindenting
set scrolloff=2               | " always keeps at least two lines visible (when seeking)

set clipboard=unnamedplus     | " makes copy and paste work (autoselectplus might work as well)
set number                    | " toggle line numbers
set whichwrap=b,s,<,>,[,]     | " beyond beginning/end line causes cusor to wrap
set backspace=indent,eol,start| " allow backspacing over everything in insert mode, not needed with whichwrap
set diffopt+=iwhite,filler    | " lets diff ignore white spaces
set spell| set spelllang=en,de| " enable spell checker 
set showcmd		                | " displays status line messages while selecting (matrix size)
set breakindent cpoptions+=n  | " when wrapping lines indent wrapped line to align with the previews
set linebreak                 | " do not wrap in the middle of words
set showbreak=›               | " symbol used in the beginning of a wrapped line
set listchars=tab:▸\ ,eol:¬   | " symbols used when using :set list (which displays non-printable chars)


set virtualedit=onemore         " one character beyond the line length should be navigatable (options: all,insert,block,onemore)
nnoremap <End> g$|              " and make the <End> key position the cursor after the last char of that line:w

" search...
set ignorecase|set smartcase    " if search pattern contains uppercase then search is case sensitive
set incsearch                   " do incremental searching
set showmatch|set matchtime=4   " blinks matching braces 

set novisualbell                " don't beep
set noerrorbells                " don't beep
set guicursor=n-v-c:ver30-Cursor-blinkon500-blinkoff500   " how the caret looks like

if has("autocmd")
  set modeline                  " set variables specific to a file, like indentation by adding a comment
  set modelines=3               " how many lines in the beginning and end of the file can be mode lines?

  
  augroup resCur              | " make cursor appear in its previous position when reopening a file...
    "autocmd!
    autocmd BufReadPost * call setpos(".", getpos("'\""))
  augroup END

  augroup PreviewOnBottom     | " will open new windows below the current (only in insert mode, so that the preview window is drawn below)
    autocmd InsertEnter * set splitbelow
    autocmd InsertLeave * set splitbelow!
  augroup END

  augroup OmniFunc            | " this will enable omnicomplete just in case this configuration runs somewhere, where YouCompleteMe is not compiled
    if exists("+omnifunc")
      autocmd Filetype *
            \	if &omnifunc == "" |
            \		setlocal omnifunc=syntaxcomplete#Complete |
            \   setlocal completeopt=longest,menuone |
            \	endif
    endif
  augroup END

  autocmd FileType text setlocal textwidth=78   " text files: set 'textwidth' to 78
  autocmd FileType gitcommit set tw=72          " longer commit messages without auto line wrapping
  autocmd FileType LaTeX let g:tex_flavor = "latex" |set conceallevel=1| set concealcursor=
endif

"================================================================================ 
" gui stuff and appearance
if &t_Co > 2
  set hlsearch               " 
  set cursorline             " highlight currently selected line
endif

if has('mouse')
  set mouse=a
endif

if has("gui_running")
  set guitablabel=%t         " do not display full path as tabname
  set guioptions+=m          " menu bar
  set guioptions+=T          " toolbar
  set guioptions+=r          " right-hand scroll bar
  set guioptions-=c          " use console dialogs instead of popups
  set guioptions+=a          " autoselect: copy&paste using middleclick
  set guioptions+=e          " add tab pages
  set guioptions+=p          " use gui pointer callback for x11 
  set toolbariconsize=large  " make the icon toolbar as big as possible
else
  if &term =~? 'mlterm\|xterm\|screen' 
    set t_Co=256                | " fixes incompatibilities with our color scheme
  endif
  set title                     | " set the terminal caption 
  set titleold="vim ended"      | " set terminal title after closing vim
  set titlestring="VIM-CONSOLE" | " set window title
  set icon                      | " sets the terminal icon to vim
  set ttyfast                   | " modern terminals are all fast in a way
endif

colorscheme maxvb6
syntax enable

"================================================================================ 
" plugin hotkeys
nnoremap <C-l> :TlistToggle<CR>|                                     " bind TagList to Hotkey Ctrl+L

" code completion: http://vim.wikia.com/wiki/Make_Vim_completion_popup_menu_work_just_like_in_an_IDE
" reacts on CTRL+P, CTRL+Space
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
inoremap <expr> <CR>       pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Down>     pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up>       pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp>   pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"

" custom commands...
cmap w!! w !sudo tee % >/dev/null|                                   " write :w!! to execute :w as root user

" custom hotkeys...
nnoremap <C-Tab> :tabnext<CR>|                                       " lets one use CTRL+Tab to switch between tabs 
nnoremap <C-S-Tab> :tabprevious<CR>|                                 " use CTRL+Shift+Tab to switch to preview tab
nnoremap j gj|nnoremap k gk|                                         " do not jump over wrapped lines...
map <C-h> <C-w>h|map <C-j> <C-w>j|map <C-k> <C-w>k|map <C-l> <C-w>l| " window navigation shortcut


"================================================================================ 
" deactivated on-demand commands (just in case one needs them one day)
" set guiheadroom=0| " do not fill non-functional area of the empty editor with gtk background
" map shift-right to visually select and so on
"nnoremap <C-Right> El
"nnoremap <S-Right> vl
"nnoremap <S-Left> vj
"nnoremap <S-Up> vk
"nnoremap <S-Down> vj
" noremap % v% " jump between braces and highlight
"nnoremap <Home> ^
"vmap <Home> ^
"nnoremap <End> $
"vmap <End> $
"nnoremap <C-Tab> <C-PageDown>
"nnoremap <C-S-Tab> <C-PageUp>
":inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
"map <Esc>OA k|map <Esc>OB j|map <Esc>OC l|map <Esc>OD h|             " allow cursor keys in insert mode
"
"inoremap <expr> <Esc>      pumvisible() ? "\<C-e>" : "\<Esc>" " breaks cursor keys!
" binding ESC can easily break cursor key movement on the console (tricky, because gvim works)
"
"
"

"inoremap <C-Space> <C-x><C-o>
"inoremap <C-@> <C-Space>