" c: Automatically break comments using the textwidth value.
" r: Automatically insert the comment leader when hitting <Enter> in insert mode.
" o: Automatically insert the comment leader when hitting 'o' or 'O' in normal mode.
" n: Recognize numbered lists. When hitting <Enter> in insert mode.
" m: Automatically break the current line before inserting a new comment line.
set formatoptions+=cronm

" This sets the width of a tab character to 4 spaces.
set tabstop=4

" This sets the number of spaces used when the <Tab> key is pressed in insert
" mode to 4.
set softtabstop=4

" This sets the number of spaces used for each indentation level when using
" the '>' and '<' commands, as well as the autoindent feature.
set shiftwidth=4

" This setting enables automatic indentation, which will copy the indentation
" of the current line when starting a new line.
set autoindent
set smartindent

" This disables the automatic conversion of tabs to spaces when you press the
" <Tab> key.
set expandtab
set smarttab

" Save 1,000 items in history
set history=1000

" Show the line and column number of the cursor position
set ruler

" Display the incomplete commands in the bottom right-hand side of your screen.  
set showcmd

" Display completion matches on your status line
set wildmenu

" Show a few lines of context around the cursor
set scrolloff=5

" Highlight search matches
set hlsearch

" Enable incremental searching
set incsearch

" Ignore case when searching
set ignorecase

" Override the 'ignorecase' option if the search pattern contains upper case characters.
set smartcase

" This enables the use of the mouse in all modes (normal, visual, insert,
" command-line, etc.).
set mouse=a

" This displays relative line numbers in the left margin.
set number
set relativenumber

" This disables the creation of backup files.
set nobackup

" To allow moving to different buffer without saving the current buffer.
set hidden

" This disables the creation of swap files.
set noswapfile

" Automatically reload files when they change
set autoread

" Enable spell checking
"set spell
"set spelllang=en

" Highlight the current line
"set cursorline

" Highlight the 100th column
" set colorcolumn=100

" Set text width to 100
set textwidth=100

" This maps the '<' and '>' keys in visual mode to shift the selected text one
" shift width to the left or right and reselect the shifted text.
vnoremap < <gv
vnoremap > >gv

" The next four lines define key mappings for switching between windows using
" Ctrl + hjkl keys
nmap <silent> <c-k> :wincmd k<CR>
nmap <silent> <c-j> :wincmd j<CR>
nmap <silent> <c-h> :wincmd h<CR>
nmap <silent> <c-l> :wincmd l<CR>

" The next four lines define key mappings for resizing windows using Alt +
" hjkl keys:
map <a-l> :vertical res -5<CR>
map <a-h> :vertical res +5<CR>
map <a-j> :res -5<CR>
map <a-k> :res +5<CR>

" These lines define key mappings for moving the cursor 10 spaces at a time
" using Shift + arrow keys:
nmap <S-l> 10l<CR>
nmap <S-h> 10h<CR>
nmap <S-j> 10j<CR>
nmap <S-k> 10k<CR>

" Enable folding
set foldenable
" Configure fold method
set foldmethod=marker
" Set the fold level to start with all folds open
set foldlevelstart=99
" Set the fold nesting level (default is 20)
set foldnestmax=10
" Automatically close folds when the cursor leaves them
set foldclose=all
" Open folds upon all motion events
set foldopen=all


"Plugin
"===========================================================================================================
filetype plugin indent on
syntax on


" Enhanced C and C++ highlighting for vim
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

" Disable function highlighting (affects both C and C++ files)
let g:cpp_function_highlight = 1

" Enable highlighting of C++11 attributes
let g:cpp_attributes_highlight = 1

" Highlight struct/class member variables (affects both C and C++ files)
let g:cpp_member_highlight = 1

" Disable highlighting of type names in class, struct, union, enum, using, and
" concept declarations (affects both C and C++ files)
let g:cpp_type_name_highlight = 1 

" Highlight operators (affects both C and C++ files)
let g:cpp_operator_highlight = 1

" Put all standard C and C++ keywords under Vim's highlight group 'Statement'
" (affects both C and C++ files)
let g:cpp_simple_highlight = 1

let g:rainbow_active = 1

"colorscheme default
syntax enable
colorscheme dracula

" Tagbar
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
nmap <F8> :TagbarToggle<CR>


" Airline
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

" Set this. Airline will handle the rest.
" let g:airline#extensions#ale#enabled = 1
let g:airline_theme = 'dracula'
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#formatter = 'default'


" Nerdtree -- File Explorer
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
let g:NERDTreeWinSize = 30
nnoremap <C-n> :NERDTreeToggle<CR>
let NERDTreeIgnore = ['\.o$', '\.obj$', '\.a$', '\.so$', '\.out$', '\.git$']
let NERDTreeShowHidden = 1


" Undotree
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
nmap <F5> :UndotreeToggle<CR>

" YCM : YouCompleteMe
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

function! s:YCMEnable() abort
    silent! packadd YouCompleteMe
    echo "YouCompleteMe enabled"
endfunction

command! YCMOn  call s:YCMEnable()


" ALE : Linting 
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


let g:ale_linters = {
\   'cpp': ['cppcheck'],
\   'c': ['cppcheck'],
\   }

" General settings
let g:ale_linters_explicit = 1
let g:ale_completion_enabled = 1
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
let g:ale_set_balloons=1
let g:ale_hover_to_floating_preview=1
let g:ale_use_global_executables = 1
let g:ale_sign_column_always = 1
let g:ale_disable_lsp = 1

let g:ale_cpp_cppcheck_options =
\ '--enable=warning,style,performance,portability ' .
\ '--std=c++17 ' .
\ '--inline-suppr ' .
\ '--quiet'

let g:ale_c_cppcheck_options =
\ '--enable=warning,style,performance,portability ' .
\ '--std=c11 ' .
\ '--inline-suppr ' .
\ '--quiet'

let g:ale_c_cppcheck_executable = 'cppcheck'
let g:ale_cpp_cppcheck_executable = 'cppcheck'
let g:ale_c_build_dir_names = ['build', 'release', 'debug']

let g:ale_cpp_cppcheck_options .=
\ ' --suppress=missingIncludeSystem' .
\ ' --suppress=unusedFunction'

let g:ale_c_cppcheck_options .=
\ ' --suppress=missingIncludeSystem' .
\ ' --suppress=unusedFunction'


" Set this. Airline will handle the rest.
let g:airline#extensions#ale#enabled = 1


" COC.nvim
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

" Making selected --> autocomplete
inoremap <expr> <cr> coc#pum#visible() ? coc#pum#confirm() : "\<CR>"

" To navigate completion lists
inoremap <expr> <Tab> coc#pum#visible() ? coc#pum#next(1) : "\<Tab>"
inoremap <expr> <S-Tab> coc#pum#visible() ? coc#pum#prev(1) : "\<S-Tab>"

let g:coc_global_extensions = ['coc-clangd']
let g:clangd_install_prefix = '/usr/'
let g:clangd_command = ['clangd',
\   '--clang-tidy',
\   '--background-index',
\   '--header-insertion-decorators=0',
\   '--completion-style=detailed']

nnoremap <silent> K :call <sid>show_documentation()<cr>
function! s:show_documentation()
    if index(['vim', 'help'], &filetype) >= 0
	execute 'help ' . expand('<cword>')
    elseif &filetype ==# 'tex'
	VimtexDocPackage
    else
	call CocAction('doHover')
    endif
endfunction


" My vimrc end -- Hizenberg
