set nocompatible
syntax on
let VIMHOME = split(&rtp, ",")[0]
let $VIMHOME = VIMHOME

" vim-plug
call plug#begin(VIMHOME."/plugs")
" Plug 'Valloric/YouCompleteMe'
Plug 'williamboman/nvim-lsp-installer'
Plug 'nixprime/cpsm', {'do': './install.sh'}
Plug 'kien/ctrlp.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'ConradIrwin/vim-bracketed-paste'
Plug 'NLKNguyen/papercolor-theme'
Plug 'Shougo/deoplete.nvim'
Plug 'christoomey/vim-tmux-navigator'
Plug 'cohama/lexima.vim', {'do': 'sed -i \"s/has(.nvim.) && //\" autoload/lexima/insmode.vim'}
Plug 'editorconfig/editorconfig-vim'
Plug 'gmarik/Vundle.vim'
Plug 'hdima/python-syntax'
Plug 'jeetsukumaran/vim-buffergator'
Plug 'kristijanhusak/vim-hybrid-material'
Plug 'lambdalisue/fern.vim'
Plug 'lervag/vimtex'
Plug 'neovimhaskell/haskell-vim'
Plug 'nvie/vim-flake8'
Plug 'octol/vim-cpp-enhanced-highlight'
Plug 'pangloss/vim-javascript'
Plug 'posva/vim-vue'
Plug 'rhysd/vim-grammarous'
Plug 'roxma/nvim-yarp'
Plug 'ervandew/supertab'
Plug 'roxma/vim-hug-neovim-rpc'
Plug 'tmux-plugins/vim-tmux'
Plug 'tmux-plugins/vim-tmux-focus-events'
Plug 'tomtom/tcomment_vim'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'vim-scripts/indentpython.vim'
Plug 'vimwiki/vimwiki'
Plug 'neovim/nvim-lspconfig'
Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'hrsh7th/cmp-buffer'
Plug 'hrsh7th/cmp-path'
Plug 'hrsh7th/cmp-cmdline'
Plug 'hrsh7th/nvim-cmp'
Plug 'hrsh7th/cmp-vsnip'
Plug 'hrsh7th/vim-vsnip'
call plug#end()

let mapleader=","


:command W w
:command Q q
:command WQ wq
:command Wq wq
nnoremap j gj
nnoremap k gk
nnoremap <C-U> <C-O>
nnoremap <C-E> <C-U>

" don't store .swp files in the file's own directory
" neither for .ext~ files
set directory=/home/user/.nvim/tmp/
set backupdir=/home/user/.nvim/tmp/

" VimWiki
let g:vimwiki_key_mappings = { 'table_mappings': 0  }
let g:vimwiki_markdown_link_ext = 1
autocmd FileType vimwiki setlocal shiftwidth=2 softtabstop=2 expandtab

 " Autoindent for filetype
filetype plugin indent on
set autoindent

set encoding=utf-8
set scrolloff=5
set sidescrolloff=10

set completeopt-=preview

set backspace=indent,eol,start

" Splits
set splitbelow
set splitright

" CtrlP
let g:ctrlp_match_func = {'match': 'cpsm#CtrlPMatch'}
nnoremap <silent> <C-o> :CtrlPBuffer<CR>
let g:cpsm_unicode=1
let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']

" Unsaved buffer switching
set hidden

" Line numbering
set number
set numberwidth=4
:set mouse=a

" Allow xterm-key usage inside tmux
execute "set <xUp>=\e[1;*A"
execute "set <xDown>=\e[1;*B"
execute "set <xRight>=\e[1;*C"
execute "set <xLeft>=\e[1;*D"

" Persistent undo
set undodir=~/.nvim/undodir/
set undofile
set undolevels=1000
set undoreload=10000

" Searching
set ignorecase
set smartcase
set incsearch
set hlsearch
nnoremap <leader><space> :noh<CR>

" Text wrapping
set lbr

" Vimtex

let g:tex_flavor = 'latex'

" Tabs
if has("autocmd")
    filetype plugin indent on
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" Terminal colors
set t_Co=256
set background=dark
let g:airline_theme="solarized"
let g:airline_solarized_bg="dark"

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab

" Commenting
nnoremap <silent> <leader>c :TComment<CR>
nnoremap <silent> <leader>C :TCommentBlock<CR>
vnoremap <silent> <leader>c :TCommentInline<CR>
vnoremap <silent> <leader>C :TCommentBlock<CR>

" Tab completion
set wildmode=longest,list
set wildmenu

set guifont=Ubuntu\ Mono\ derivative\ Powerline\ 13
let g:airline_powerline_fonts = 1
set laststatus=2
set ttimeoutlen=50

" Color scheme
syntax enable
let python_highlight_all=1
let g:solarized_termcolors=256
colorscheme hybrid_material

" Remap u to y
vnoremap u y

" Save clipboard on quit
autocmd VimLeave * call system("xsel -ib", getreg('+'))

" Automatically remove trailing spaces
let blacklist = ['vimwiki']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | :%s/\s\+$//e

" Use deoplete.
autocmd FileType python let g:deoplete#enable_at_startup = 1

" VPW: set filetype for .py3
autocmd BufRead,BufNewFile *.py3 set filetype=python

" Vue indent
autocmd FileType vue setlocal shiftwidth=2 softtabstop=2 expandtab
autocmd FileType javascript setlocal shiftwidth=2 softtabstop=2 expandtab
autocmd FileType vue syntax sync fromstart

" Disable shift+k for manual lookup
map <S-k> <Nop>

" Prolog: set filetype for .pl
autocmd BufRead,BufNewFile *.pl set filetype=prolog

" Disable modelines, fix CVE
set modelines=0
set nomodeline

" Tab for completion
let g:SuperTabContextDefaultCompletionType = "<c-n>"
let g:SuperTabDefaultCompletionType = "<c-n>"

lua <<EOF
  -- Setup nvim-cmp.
  local cmp = require'cmp'

  cmp.setup({
  snippet = {
      -- REQUIRED - you must specify a snippet engine
      expand = function(args)
      vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users.
      -- require('luasnip').lsp_expand(args.body) -- For `luasnip` users.
      -- require('snippy').expand_snippet(args.body) -- For `snippy` users.
      -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users.
      end,
      },
  window = {
      completion = cmp.config.window.bordered(),
      documentation = cmp.config.window.bordered(),
      },
  mapping = cmp.mapping.preset.insert({
  ['<C-b>'] = cmp.mapping.scroll_docs(-4),
  ['<C-f>'] = cmp.mapping.scroll_docs(4),
  ['<C-Space>'] = cmp.mapping.complete(),
  ['<C-e>'] = cmp.mapping.abort(),
  ['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
  ["<Tab>"] = cmp.mapping(function(fallback)
     if cmp.visible() then
       cmp.select_next_item()
   elseif vim.fn["vsnip#available"](1) == 1 then
       feedkey("<Plug>(vsnip-expand-or-jump)", "")
     else
       fallback() -- The fallback function sends a already mapped key. In this case, it's probably `<Tab>`.
     end
   end, { "i", "s" }),

   ['<S-Tab>'] = cmp.mapping(function()
     if cmp.visible() then
       cmp.select_prev_item()
     elseif vim.fn["vsnip#jumpable"](-1) == 1 then
       feedkey("<Plug>(vsnip-jump-prev)", "")
     end
   end, { "i", "s"}),
  }),
    sources = cmp.config.sources({
    { name = 'nvim_lsp' },
    { name = 'vsnip' }, -- For vsnip users.
    -- { name = 'luasnip' }, -- For luasnip users.
    -- { name = 'ultisnips' }, -- For ultisnips users.
    -- { name = 'snippy' }, -- For snippy users.
    }, {
    { name = 'buffer' },
    })
})

  -- Set configuration for specific filetype.
  cmp.setup.filetype('gitcommit', {
    sources = cmp.config.sources({
      { name = 'cmp_git' }, -- You can specify the `cmp_git` source if you were installed it.
    }, {
      { name = 'buffer' },
    })
  })

  -- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore).
  cmp.setup.cmdline('/', {
    mapping = cmp.mapping.preset.cmdline(),
    sources = {
      { name = 'buffer' }
    }
  })

  -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore).
  cmp.setup.cmdline(':', {
    mapping = cmp.mapping.preset.cmdline(),
    sources = cmp.config.sources({
      { name = 'path' }
    }, {
      { name = 'cmdline' }
    })
  })

  -- Setup lspconfig.
  local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
  require("nvim-lsp-installer").setup({
  automatic_installation = true, -- automatically detect which servers to install (based on which servers are set up via lspconfig)
  })
  -- Replace <YOUR_LSP_SERVER> with each lsp server you've enabled.
  require('lspconfig')['pyright'].setup {
    capabilities = capabilities
  }
  require('lspconfig')['texlab'].setup {
    capabilities = capabilities
  }
  require('lspconfig')['ltex'].setup {
    capabilities = capabilities
  }
EOF

" Lanuage server
nnoremap <silent> <buffer> gd   :lua vim.lsp.buf.definition()<CR>
set updatetime=300
set signcolumn=number

nmap <silent> <leader>n :lua vim.lsp.diagnostic.goto_next()<CR>
nmap <silent> <leader>p :lua vim.lsp.diagnostic.goto_prev()<CR>
nmap <silent> <leader>f :lua vim.lsp.buf.code_action()<CR>