set nocompatible
" Syntax highlighting
syntax on
" Line numbering
set number
" Always show the signcolumn
set signcolumn=yes
" highlight
set cursorline
" Encoding
set encoding=UTF-8
" Auto-indentation
set ai
set tabstop=4
set shiftwidth=4
set expandtab
" Matching paren highlighting
set showmatch
" Sane colors
set background=dark
" Show cursor pos
set ruler
" Make the status line always show up
set laststatus=2
set ttimeoutlen=50
" Shut the annoying bell
set novisualbell
" Set the updatetime
set updatetime=500
" Case insensitive when all lowercase
set ignorecase
set smartcase

" Remap arrow keys
noremap <Up> <NOP>
noremap <Down> <NOP>
nnoremap <Left> :bprev<CR>
nnoremap <Right> :bnext<CR>

" write the file when you accidentally opened it without the right (root) privileges
cmap w!! w !sudo tee % > /dev/null

" Remember mouse cursor position
augroup resCur
    autocmd!
    autocmd BufReadPost * call setpos(".", getpos("'\""))
augroup END

" Plugins
let deinpath=$HOME.'/.vim/bundle/repos/github.com/Shougo/dein.vim'
let pluginpath=$HOME.'/.vim/bundle'
let &rtp.=','.deinpath

if dein#load_state(pluginpath)
    call dein#begin(pluginpath)

    "call dein#add(deinpath)
    call dein#add('tpope/vim-sensible')

    " Colorscheme
    call dein#add('https://git.sr.ht/~ackyshake/spacegray.vim')

    " Interface
    call dein#add('itchyny/lightline.vim')
    call dein#add('mgee/lightline-bufferline')
    call dein#add('ryanoasis/vim-devicons')
    call dein#add('airblade/vim-gitgutter')
    call dein#add('scrooloose/nerdtree')
    call dein#add('Yggdroot/indentLine')

    " Movement
    call dein#add('christoomey/vim-tmux-navigator')
    "call dein#add('easymotion/vim-easymotion')
    call dein#add('unblevable/quick-scope')

    " Tools / Commands
    call dein#add('tpope/vim-surround')
    call dein#add('jiangmiao/auto-pairs')
    call dein#add('tpope/vim-endwise')
    "call dein#add('chrisbra/unicode.vim')
    call dein#add('ctrlpvim/ctrlp.vim')
    "call dein#add('junegunn/fzf.vim')
    call dein#add('tpope/vim-obsession')

    " Linting / Completion
    call dein#add('w0rp/ale')
    call dein#add('Shougo/deoplete.nvim')
    call dein#add('ervandew/supertab')
    call dein#add('autozimu/LanguageClient-neovim', { 'rev': 'next', 'build': 'bash install.sh'})

    " Language
    call dein#add('sheerun/vim-polyglot')

    call dein#end()
    call dein#save_state()
endif

filetype plugin indent on
syntax enable

" Automatically install plugins
if dein#check_install()
    call dein#install()
endif

" Color scheme
colorscheme spacegray
" 16 millions colors
"set termguicolors
" Disable background in terminal
hi Normal ctermbg=NONE

" Italic comments
highlight Comment cterm=italic
set t_ZH=
set t_ZR=

" deoplete
let g:deoplete#enable_at_startup = 1

" LanguageClient
set hidden
let g:LanguageClient_serverCommands = {
    \ 'python': ['/usr/bin/pyls'],
    \ 'sh': ['bash-language-server', 'start'],
    \ 'terraform': ['/usr/bin/terraform-lsp'],
    \ 'yaml': ['/usr/bin/yaml-language-server'],
    \ }
nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
nnoremap <silent> <F12> :call LanguageClient#textDocument_definition()<CR>
nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR>

" supertab
let g:SuperTabDefaultCompletionType = "<c-n>"

" ALE
let g:ale_sign_error = ''
let g:ale_sign_warning = ''
highlight ALEErrorSign ctermfg=Red
highlight ALEWarningSign ctermfg=Blue
highlight ALEError ctermfg=Red ctermbg=None cterm=underline
highlight ALEWarning ctermfg=Blue ctermbg=None cterm=underline

" nerdtree
map <C-n> :NERDTreeToggle<CR>

" ctrlp
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'

" gitgutter
let g:gitgutter_realtime = 1
let g:gitgutter_eager = 0
let g:gitgutter_override_sign_column_highlight = 0
let g:gitgutter_grep = 'rg'
let g:gitgutter_sign_added = '+▐'
let g:gitgutter_sign_modified = '~▐'
let g:gitgutter_sign_removed = '-▐'
let g:gitgutter_sign_removed_first_line = '-▐'
let g:gitgutter_sign_modified_removed = '~▐'
highlight SignColumn ctermbg=None
highlight GitGutterAdd ctermfg=green
highlight GitGutterChange ctermfg=yellow
highlight GitGutterDelete ctermfg=red
highlight GitGutterChangeDelete ctermfg=red

" indentLine
let g:indentLine_faster = 1
let g:indentLine_color_term = 237
let g:indentLine_leadingSpaceEnabled = 1
let g:indentLine_char = '┆'
let g:indentLine_leadingSpaceChar = '·'

" lightline
set noshowmode
set showtabline=2
let g:lightline = {
    \ 'colorscheme': 'wombat',
    \ 'active': {
        \ 'left': [ [ 'mode', 'paste' ],
        \           [ 'readonly', 'filename' ],
        \           [ 'ctrlpmark' ] ],
        \ 'right': [ [ 'lineinfo' ],
        \            [ 'percent' ],
        \            [ 'linter_errors' ],
        \            [ 'fileformat', 'fileencoding', 'filetype', 'linter_ok', 'linter_warnings' ] ],
    \ },
    \ 'component_expand': {
        \ 'linter_warnings': 'LightlineLinterWarnings',
        \ 'linter_errors': 'LightlineLinterErrors',
        \ 'linter_ok': 'LightlineLinterOK'
    \ },
    \ 'component_type': {
        \ 'readonly': 'error',
        \ 'linter_errors': 'error',
        \ 'linter_warning': 'warning',
    \ },
    \ 'component_function': {
        \ 'filename': 'LightlineFilename',
    \ },
\ }

"lightline-bufferline
let g:lightline#bufferline#show_number=2
let g:lightline#bufferline#number_map = {
    \ 0: '⁰', 1: '¹', 2: '²', 3: '³', 4: '⁴',
    \ 5: '⁵', 6: '⁶', 7: '⁷', 8: '⁸', 9: '⁹'
\ }
let g:lightline#bufferline#enable_devicons=1
let g:lightline#bufferline#min_buffer_count=2
let g:lightline.tabline          = {'left': [['buffers']], 'right': []}
let g:lightline.component_expand = {'buffers': 'lightline#bufferline#buffers'}
let g:lightline.component_type   = {'buffers': 'tabsel'}

function! LightlineFilename()
    let filename = expand('%:t') !=# '' ? expand('%:t') : '[No Name]'
    let modified = &modified ? ' +' : ''
    return filename . modified
endfunction

function! LightlineLinterWarnings() 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 ? '' : printf('%d ', all_non_errors)
endfunction

function! LightlineLinterErrors() 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 ? '' : printf('%d ', all_errors)
endfunction

function! LightlineLinterOK() 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 ? '0 ' : ''
endfunction

autocmd User ALELint call s:MaybeUpdateLightline()

" Update and show lightline but only if it's visible (e.g., not in Goyo)
function! s:MaybeUpdateLightline()
    if exists('#lightline')
        call lightline#update()
    end
endfunction