" vi:columns=160:list:ts=2:sts=2:sw=2
"================================================================================
" Vundle: plugin manager...
set nocompatible                                      | " do not try to be vi, be vim (required by Vundle)
filetype off                                          | " Vundle needs this
set rtp+=~/.vim/plugins/Vundle.vim                    | " set runtimepath (required by Vundle)
call vundle#begin('~/.vim/plugins/')                  | " location where Vundle searches&installs plugins

" Plugin dependant configurations...
Plugin 'VundleVim/Vundle.vim'                         | " Vundle itself (required)
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 'jeaye/color_coded'                            | " semantic highlighting with vim
Plugin 'terryma/vim-multiple-cursors'                 | " displays visual block mode as cursors

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 = '~/.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
"let g:ycm_semantic_triggers = {'c' : ['(', ',']}     | " add additional triggers (not recommend)

let b:html_omni_flavor='xhtml'                        | " prever xhtml over html because that makes inline php code possible without hassle
let html_use_css = 1                                  | " when using :TOhtml no font-tags will be used, but proper css

call vundle#end()             | " required by Vundle
filetype plugin indent on     | " required by Vundle
"================================================================================ 
" custom config
colorscheme coderonline
syntax enable

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 (abbr: tabstop, softtabstop, shiftwidth)
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 selectmode=mouse          | " avoid using select mode (only with mouse)
set mousemodel=popup_setpos   | " display a default right click menu for the selection (that is c&p is possible)
set selection=exclusive       | " includes last character of the selection into following command (like x or d)

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 spelllang=en,de     | " enable spell checker
set virtualedit=onemore       | " one character beyond the line length should be navigatable (options: all,insert,block,onemore)
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 showcmd                   | " displays status line messages while selecting (matrix size)
set nofoldenable              | " do not fold code automatically
set tags+=~/.vim/systags      | " ctags -R -f ~/.vim/systags /usr/include /usr/local/include
set wildmenu wildmode=full    | " wildmenu code completion

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

set novisualbell              | " don't beep
set noerrorbells              | " don't beep
set clipboard=unnamedplus     | " makes copy and paste work (autoselectplus might work as well)
set number                    | " toggle line numbers

if has("multi_byte")
  set encoding=utf-8          | " we need default utf-8 encoding to use cool chars as line break and so on (see below)
  scriptencoding utf-8        | " tell vim that we are using utf-8 here
  set showbreak+=›            | " symbol used in the beginning of a wrapped line
  set listchars=eol:↲         | " symbols used when using :set list (which displays non-printable chars)
  set listchars+=trail:·      | " symbols used when using :set list (which displays non-printable chars)
  set listchars+=precedes:«   | " symbols used when using :set list (which displays non-printable chars)
  set listchars+=extends:»    | " symbols used when using :set list (which displays non-printable chars)
  set listchars+=tab:▸\       | " symbols used when using :set list (which displays non-printable chars)
endif

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 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=
  autocmd BufNewFile,BufReadPost *.config set filetype=xml | " visual studio config file
  autocmd BufNewFile,BufReadPost *.csproj set filetype=xml | " visual studio project file
  autocmd BufNewFile,BufReadPost *.sln set filetype=xml    | " visual studio solution file
endif

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


if has("gui_running")
  set mouse=a                   | " use mouse in gui-mode (which is default)
  set mouseshape+=n:beam,v:beam | " display a text input cursor even in normal and selection mode
  set guicursor=n-v-c:ver30-Cursor-blinkon500-blinkoff500  | " how the caret looks like
  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
  "set columns=80               | " set initial window width (so that it fits the terminals)
else
  if &term =~? 'mlterm\|xterm\|screen'
    set t_Co=256                | " fixes incompatibilities with our color scheme
  endif
  set mouse=nh                  | " limits mouse usage to normal mode and help files, so that middle click text insertion works in insert mode
  set title                     | " set the terminal caption
  set icon                      | " sets the terminal icon to vim
  set ttyfast                   | " modern terminals are all fast in a way
  "set titleold="vim ended"      | " set terminal title after closing vim
  "set titlestring="VIM-CONSOLE" | " set window title
  "if has('mouse')
  "endif
endif


"================================================================================ 
" custom commands...
map <C-h> <C-w>h|map <C-j> <C-w>j|     " window navigation shortcuts
map <C-k> <C-w>k|map <C-l> <C-w>l|     " window navigation shortcuts

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

nnoremap $ g$|                         " and make the $ key position the cursor after the last char of that line, not before
nnoremap <End> g$|                     " and make the <End> key position the cursor after the last char of that line
function ExtendedHome()
    let column = col('.')
    normal! ^
    if column == col('.')
        normal! 0
    endif
endfunction
noremap <Home> ^
noremap <silent> <Home> :call ExtendedHome()<CR>

nnoremap <C-z> u


"map <C-Right>        el
"map <C-left>         hgel
"vnoremap <C-S-Right> e
"vnoremap <C-S-left>  b


" plugin hotkeys
map <C-l> :TlistToggle<CR>|       " bind TagList to Hotkey Ctrl+L
inoremap <buffer> ( <C-X><C-o><C-p>(|  " when opening a bracket: call the OmniComplete function, display the menu, but deselect the first entry (C-p)


set makeprg=make\ test
nnoremap <F5> :!make<CR>|              " classic key binding: press F5 to compile and execute (if you have a Makefile with make test doing that)


"================================================================================
" deactivated on-demand commands (just in case one needs them one day)
"
" 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>"
" 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>"
"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>
"
"map <Esc>OA k|map <Esc>OB j|map <Esc>OC l|map <Esc>OD h|             " allow cursor keys in insert mode