set nocompatible              " be iMproved, required
filetype off                  " required
let mapleader = ";"
let install = 0

if empty(glob("~/.vim/autoload/plug.vim"))
  silent execute '!mkdir -p ~/.vim/autoload'
  silent execute '!mkdir -p ~/.vim/undodir'
  silent execute '!mkdir -p ~/.vim/swapdir'
  silent execute '!curl -fLo ~/.vim/autoload/plug.vim https://raw.github.com/junegunn/vim-plug/master/plug.vim'
  let install = 1
endif

call plug#begin()

Plug 'tpope/vim-fugitive'
Plug 'puremourning/vimspector'
Plug 'vim-scripts/DrawIt'
Plug 'Bercio/vim-inkscape-insert'
Plug 'rstacruz/sparkup', {'rtp': 'vim/'}

Plug 'vim-pandoc/vim-pandoc'
Plug 'vim-pandoc/vim-pandoc-syntax'

Plug 'MarcWeber/vim-addon-mw-utils'
Plug 'tomtom/tlib_vim'
Plug 'cespare/vim-toml'
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'

Plug 'mhartington/oceanic-next'

Plug 'preservim/nerdtree'

Plug 'farmergreg/vim-lastplace'

Plug 'sk1418/HowMuch'

Plug 'godlygeek/tabular'
Plug 'vim-crystal/vim-crystal'
Plug 'stephpy/vim-yaml'
Plug 'MaxMEllon/vim-jsx-pretty'
Plug 'arrufat/vala.vim'
Plug 'chaimleib/vim-renpy'
Plug 'vhda/verilog_systemverilog.vim'
Plug 'gregkh/kernel-coding-style'

Plug 'dense-analysis/ale'
Plug 'PenguinOwl/lsp'
Plug 'editorconfig/editorconfig-vim'

Plug '907th/vim-auto-save'

call plug#end()            " required

if install
  set number
  PlugInstall
  q
endif

filetype plugin indent on    " required

set number
set tabstop=2 shiftwidth=2 expandtab
set ai
nnoremap <expr> gp '`[' . strpart(getregtype(), 0, 1) . '`]'
" tnoremap <ESC> <C-\><C-n>
tnoremap <Esc> <C-W>N
tnoremap <Esc><Esc> <C-W>N
set timeout timeoutlen=500  " Default
set ttimeout ttimeoutlen=100  " Set by defaults.vim
set undofile
set undodir=~/.vim/undodir
set directory=~/.vim/swapdir
set ignorecase
set smartcase
set nomodeline
set exrc
set secure
set cursorline
set wildmode=longest,list
set wildmenu

let g:solarized_termcolors=256

let g:pandoc#folding#fold_yaml=1
let g:pandoc#folding#mode = ['manual']
let g:pandoc#folding#fdc = 0
let g:pandoc#syntax#conceal#use=0
let g:UltiSnipsExpandTrigger="<c-s>"
let g:UltiSnipsJumpForwardTrigger="<c-s>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
let g:UltiSnipsListSnippets="<c-a>"
if (has("termguicolors"))
 set termguicolors
endif

" Theme
syntax enable
colorscheme OceanicNext
let g:airine_theme='oceanicnext'
let g:airline_powerline_fonts = 1
autocmd FileType help setlocal nospell

set laststatus=2
set statusline=%m\ %F\ %y\ %{&fileencoding?&fileencoding:&encoding}\ %=%(C:%c\ L:%l\ %P%)

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") 
      \ && b:NERDTree.isTabTree()) | q | endif
autocmd FileType gitcommit setlocal spell

set viminfo='20,<1000,s1000

hi CursorLineNr term=bold cterm=bold ctermfg=012 gui=bold
hi EndOfBuffer ctermfg=bg guifg=#404950
hi ALEError ctermbg=DarkRed
hi ALEWarning ctermbg=DarkBlue
hi SpellBad ctermbg=88
hi SpellCap ctermbg=97 guibg=#c65d34
hi SpellRare ctermbg=52
hi SpellLocal ctermbg=19
hi Pmenu ctermfg=145 ctermbg=233 guifg=#a7adba guibg=#263956
hi PmenuSel ctermfg=145 ctermbg=233 guifg=#ffffff guibg=#0d6221
hi Search ctermfg=243 ctermbg=221 guifg=#dfdd99 guibg=#715910
hi! def link DiffAdded DiffAdd
hi! def link DiffRemoved DiffDelete
hi! def link ALEError SpellBad
hi! def link ALEWarning SpellCap

inoremap <expr> <TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr> <S-TAB> pumvisible() ? "\<C-p>" : "\<TAB>"

noremap <leader>= :Tab /^[^=]\zs=*<return>
noremap <leader>p <C-w><up>
noremap <leader>; <C-w><down>
noremap <leader>l <C-w><left>
noremap <leader>' <C-w><right>
noremap <leader>t :NERDTree %<return>
noremap <leader>2 :botright terminal<return><C-w>10_
noremap <leader>q :qa<return>
noremap <leader>Q :qa!<return>
noremap <leader>a :xa<return>
noremap <leader>r :w<return>:!%:p<return>
noremap <leader>9 :%!xxd<return>
noremap <leader>0 :%!xxd -r<return>
noremap <leader>e :diffput RE<return>]c
noremap <leader>r :diffg RE<return>]c
noremap <leader>f :ALEFix<return>
noremap <leader>i :ALEImport<return>
noremap <leader>x :LspCodeAction<return>
noremap <leader>d :LspGotoDefinition<return>
noremap <leader>D :LspGotoDeclaration<return>
noremap <leader>w :LspShowReferences<return>
noremap <leader>z :LspRename<return>
noremap <leader>s :ALEDetail<return>
noremap ]e :ALENext<return>
noremap [e :ALEPrevious<return>
noremap <leader>kb <Plug>VimspectorToggleBreakpoint
noremap <leader>kr <Plug>VimspectorRestart
noremap <leader>kc <Plug>VimspectorContinue
noremap <leader>ks <Plug>VimspectorStepInto
noremap <leader>kd <Plug>VimspectorStepOver
noremap <leader>ka <Plug>VimspectorStepOut
noremap <leader>kw <Plug>VimspectorBalloonEval
noremap <leader>kx :VimspectorReset<return>
noremap <leader><tab> :tab split<return>

let g:vimspector_sidebar_width = 40
let g:vimspector_bottombar_height = 3
let g:vimspector_code_minwidth = 120
"let g:vimspector_terminal_maxwidth = 80
"let g:vimspector_terminal_minwidth = 10

set mouse=a

set foldmethod=indent
set foldlevel=1
set foldclose=all
set nofoldenable
set foldlevel=99
set scrolloff=7
set noballoonevalterm

let g:ale_linters = #{
\   cs: [],
\   c: [],
\   ruby: []
\ }

let g:ale_fixers = #{
\   python: [
\     'remove_trailing_lines',
\     'trim_whitespace',
\     'autoimport',
\     'autoflake',
\     'isort',
\     'black',
\   ],
\   crystal: ['crystal'],
\   javascript: ['prettier', 'eslint'],
\   typescript: ['prettier', 'eslint'],
\   javascriptreact: ['prettier', 'eslint'],
\   typescriptreact: ['prettier', 'eslint'],
\   c: ['clang-format'],
\ }

function SetupALEBuffer()
  if wordcount().chars > 50000
    let g:ale_enabled=0
  else
    let g:ale_enabled=1
  endif
endfunction

set pumheight=10
let lang_server_path = $VIRTUAL_ENV.'/bin/pyright-langserver'
let lspOpts = #{
\   aleSupport: 1,
\   snippetSupport: 1,
\ }
let lsp_configs = [#{name: 'pyright',
                \    filetype: ['python'],
                \    path: lang_server_path,
                \    args: ['--stdio'],
                \    workspaceConfig: #{
                \      python: #{
                \        pythonPath: $VIRTUAL_ENV.'/bin/python'
                \    }}
                \  },
                \  #{name: 'tsserver',
                \    filetype: ['javascript', 'typescript', 'javascriptreact', 'typescriptreact'],
                \    path: '/usr/bin/typescript-language-server',
                \    args: ['--stdio']
                \  },
                \  #{name: 'vscode-css',
                \    filetype: ['css', 'scss', 'less'],
                \    path: 'vscode-css-language-server',
                \    args: ['--stdio'],
                \    initializationOptions: #{
                \      provideFormatter: 0
                \    }
                \  },
                \  #{name: 'omnisharp',
                \    filetype: ['cs'],
                \    path: '/usr/lib/omnisharp/OmniSharp',
                \    args: ['-z', '--languageserver', '--encoding', 'utf-8']
                \  },
                \  #{name: 'crystalline',
                \    filetype: ['crystal'],
                \    path: '/usr/bin/crystalline',
                \    args: ['--stdio'],
                \    rootSearch: ['shard.yml', '.git']
                \  },
                \  #{name: 'ruby-lsp',
                \    filetype: ['ruby'],
                \    path: '/usr/bin/ruby-lsp',
                \    rootSearch: ['Gemfile', '.git']
                \  },
                \  #{name: 'clangd',
                \    filetype: ['c', 'cpp'],
                \    path: '/usr/bin/clangd',
                \    args: ['--background-index', '--clang-tidy']
                \  }
                \ ]

let lsp_list = []

for config in lsp_configs
  if executable(config["path"])
    let lsp_list = add(lsp_list, config)
  endif
endfor

autocmd BufEnter * call SetupALEBuffer()
autocmd BufEnter *.log setlocal autoread
autocmd User LspSetup call LspAddServer(lsp_list)
autocmd User LspSetup call LspOptionsSet(lspOpts)
autocmd User LspAttached let b:ale_disable_lsp = 1
"autocmd BufEnter *.jsx call UltiSnipsAddFiletypes(["html", "javascript"])

