let g:ycm_server_keep_logfiles = 1
let g:ycm_server_log_level = 'debug'

set laststatus=2
set number
set nocompatible              " required
filetype off                  " required

" disable hidden buffers, i.e make vim behave like any other multi file editor
set hidden

set encoding=utf-8
set t_Co=256
set tabstop=4
set softtabstop=0 noexpandtab
set shiftwidth=4

" enable search highlighting
set hlsearch

" paste multiple times
xnoremap p pgvy

" set the leader key to space
let mapleader = "\<Space>"

" map close tab to ctrl + w
nmap <leader>w :q<CR>
nmap <leader>W :q!<CR>

" split pane
nmap <leader>vs :vs<CR>
nmap <leader>hs :hs<CR>

" copy to system clipboard
set clipboard=unnamedplus
noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

"latex plugin
Plugin 'LaTeX-Suite-aka-Vim-LaTeX'

" vim debugger plugin
Plugin 'vim-vdebug/vdebug'

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'

" simplefold plugin
Plugin 'tmhedberg/SimpylFold'

" python aut-ident plugin
Plugin 'vim-scripts/indentpython.vim'
Plugin 'Yggdroot/indentLine'

" python autocomplete plugin
Bundle 'Valloric/YouCompleteMe'

"Plugin 'davidhalter/jedi-vim'
" for better usage of splits in vim
"let g:jedi#use_splits_not_buffers = "left"
"let g:jedi#use_tabs_not_buffers = 1
" automatically select the first line in the popup for better flow
"let g:jedi#popup_select_first = 0

" terraform plugin
Plugin 'hashivim/vim-terraform'
let g:terraform_aling=1
let g:terraform_fold_sections=1
let g:terraform_fmt_on_save=1

" python syntax checking
Plugin 'vim-syntastic/syntastic'

" python PEP8 checking
Plugin 'nvie/vim-flake8'
Plugin 'tell-k/vim-autopep8'
autocmd FileType python noremap <buffer> <leader>r :call Autopep8()<CR>

" auto pairs of brackets etc.
Plugin 'jiangmiao/auto-pairs'

" rainbow brackets
Plugin 'luochen1990/rainbow'
" enable by default
au BufEnter * RainbowToggle
let g:rainbow_conf = {
\	'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick'],
\	'ctermfgs': ['lightblue', 'lightyellow', 'lightcyan', 'lightmagenta'],
\	'guis': [''],
\	'cterms': [''],
\	'operators': '_,_',
\	'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'],
\	'separately': {
\		'*': {},
\		'markdown': {
\			'parentheses_options': 'containedin=markdownCode contained',
\		},
\		'lisp': {
\			'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick', 'darkorchid3'], 
\		},
\		'haskell': {
\			'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/\v\{\ze[^-]/ end=/}/ fold'], 
\		},
\		'vim': {
\			'parentheses_options': 'containedin=vimFuncBody', 
\		},
\		'perl': {
\			'syn_name_prefix': 'perlBlockFoldRainbow', 
\		},
\		'stylus': {
\			'parentheses': ['start=/{/ end=/}/ fold contains=@colorableGroup'],
\		},
\		'css': 0, 
\	}	
\}

" better commenting
Plugin 'preservim/nerdcommenter'
" let the leader key to space Add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1
" Use compact syntax for prettified multi-line comments
let g:NERDCompactSexyComs = 1
" " Align line-wise comment delimiters flush left instead of following code indentation
let g:NERDDefaultAlign = 'left'
"" Set a language to use its alternate delimiters by default
let g:NERDAltDelims_java = 1
" Add your own custom formats or override the defaults
let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/'  }  }
"" Allow commenting and inverting empty lines (useful when commenting a region)
let g:NERDCommentEmptyLines = 1
" Enable trimming of trailing whitespace when uncommenting
let g:NERDTrimTrailingWhitespace = 1
"" Enable NERDCommenterToggle to check all selected lines is commented or not 
let g:NERDToggleCheckAllLines = 1"

" python color_scheme plugin
Plugin 'jnurmine/Zenburn'
Plugin 'altercation/vim-colors-solarized'

" plugin for easier file browsing
Plugin 'scrooloose/nerdtree'
Plugin 'jistr/vim-nerdtree-tabs'
Plugin 'Xuyuanp/nerdtree-git-plugin'

set modifiable

let NERDTreeIgnore=['\.pyc$', '\~$'] "ignore files in NERDTree

" automatically open nerdtree
autocmd StdinReadPre * let s:std_in=1
" open nerdtree in empty vim session
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
" shortcut for opening nerdtree
map <leader>e :NERDTreeToggle<CR>
" close vim if only session is nerdtree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" let nerdtree show hidden files
let NERDTreeShowHidden=1

" better searching in vi
Plugin 'ctrlpvim/ctrlp.vim'
let g:ctrlp_map = '<leader>t'
let g:ctrlp_cmd = 'CtrlP'
let g:ctrlp_working_path_mode = 'ra'
let g:ctrlp_switch_buffer = 'et'

" git integration
Plugin 'tpope/vim-fugitive'
Plugin 'airblade/vim-gitgutter'

if has('gui_running')
	set background=dark
	colorscheme solarized
else
	colorscheme deus
endif
      
" powerline plugin
Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}

" class outline viewer plugin
Plugin 'majutsushi/tagbar'
nmap <leader>c :TagbarToggle<CR>

" syntax highlighting
Plugin 'dense-analysis/ale'
let g:ale_linters = {
      \   'python': ['flake8', 'pylint'],
      \   'ruby': ['standardrb', 'rubocop'],
      \   'javascript': ['eslint'],
      \}
let g:ale_fixers = {
      \    'python': ['yapf'],
      \}
"nmap <leader>r :ALEFix<CR>
let g:ale_fix_on_save = 1
function! LinterStatus() abort
	let l:counts = ale#statusline#Count(bufnr(''))

	let l:all_errors = l:counts.error + l:counts.style_error
	let l:all_non_errors = l:counts.total - l:all_errors

	return l:counts.total == 0 ? '✨ all good ✨' : printf(
		\   '😞 %dW %dE',
		\   all_non_errors,
		\   all_errors
		\)
endfunction

set statusline=
set statusline+=%m
set statusline+=\ %f
set statusline+=%=
set statusline+=\ %{LinterStatus()}

" vim-go plugin
Plugin 'fatih/vim-go'

" buffer explorer plugin
Plugin 'jlanzarotta/bufexplorer'

" jupyter vim plugin
"Plugin 'jupyter-vim/jupyter-vim'
" Always use the same virtualenv for vim, regardless of what Python
" environment is loaded in the shell from which vim is launched
"let g:vim_virtualenv_path = '/home/arch/.vim/jupyter_vim_venv'
"if exists('g:vim_virtualenv_path')
"    pythonx import os; import vim
"    pythonx activate_this = os.path.join(vim.eval('g:vim_virtualenv_path'), 'bin/activate_this.py')
"    pythonx with open(activate_this) as f: exec(f.read(), {'__file__': activate_this})
"endif

" pretty python code
let python_highlight_all = 1
syntax on

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

"split navigations
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

" Enable folding
set foldmethod=indent
set foldlevel=99
nnoremap <leader>f za

" better python identation
au BufNewFile,BufRead *.py
    \ set tabstop=4 |
    \ set softtabstop=4 |
    \ set shiftwidth=4 |
    \ set textwidth=79 |
    \ set expandtab |
    \ set autoindent |
    \ set fileformat=unix

au BufNewFile,BufRead *.js, *.html, *.css
    \ set tabstop=2 |
    \ set softtabstop= |2
    \ set shiftwidth=2


" flag unnecessary whitespace in python files
highlight BadWhitespace ctermbg=red guibg=darkred
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/

" additional options for youcompleteme
let g:ycm_autoclose_preview_window_after_completion=1
map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>

"python with virtualenv support
py3 << EOF
#import os
#import sys
#if 'VIRTUAL_ENV' in os.environ:
#	project_base_dir = os.environ['VIRTUAL_ENV']
#	activate_this = os.path.join(project_base_dir,
#	'bin/activate_this.py')
#	execfile(activate_this, dict(__file__=activate_this))
EOF
