{ config, pkgs, ... }:

let
  customPlugins.vim-better-whitespace = pkgs.vimUtils.buildVimPlugin {
    name = "vim-better-whitespace";
    src = pkgs.fetchFromGitHub {
      owner = "ntpeters";
      repo = "vim-better-whitespace";
      rev = "984c8da518799a6bfb8214e1acdcfd10f5f1eed7";
      sha256 = "10l01a8xaivz6n01x6hzfx7gd0igd0wcf9ril0sllqzbq7yx2bbk";
    };
  };

in {

  environment.systemPackages = [
    pkgs.python27Full # required for youcompleteme
    (pkgs.vim_configurable.customize {
      name = "vim";

    vimrcConfig.customRC = ''
      set nocompatible
      syntax on

      filetype off
      filetype plugin indent on

      colorscheme darkblue
      set background=dark

      set number
      set relativenumber
      set mouse=a
      set ignorecase
      set incsearch
      set wildignore=*.o,*.obj,*.bak,*.exe,*.os
      set textwidth=79
      set shiftwidth=2
      set expandtab
      set softtabstop=2
      set shiftround
      set smarttab
      set tabstop=2
      set et
      set autoindent
      set backspace=indent,eol,start


      inoremap <F1> <ESC>
      nnoremap <F1> <ESC>
      vnoremap <F1> <ESC>

      nnoremap <F5> :UndotreeToggle<CR>
      set undodir  =~/.vim/undo
      set undofile
      "maximum number of changes that can be undone
      set undolevels=1000000
      "maximum number lines to save for undo on a buffer reload
      set undoreload=10000000

      nnoremap <F2> :set invpaste paste?<CR>
      set pastetoggle=<F2>
      set showmode

      set showmatch
      set matchtime=3
      set hlsearch

      autocmd ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red


      " save on focus lost
      au FocusLost * :wa

      autocmd BufRead *.json set filetype=json
      au  BufNewFile,BufRead *.mustache set syntax=mustache

      cnoremap SudoWrite w !sudo tee > /dev/null %

      " create Backup/tmp/undo dirs
      set backupdir=~/.vim/backup
      set directory=~/.vim/tmp

      function! InitBackupDir()
        let l:parent = $HOME    . '/.vim/'
        let l:backup = l:parent . 'backup/'
        let l:tmpdir = l:parent . 'tmp/'
        let l:undodir= l:parent . 'undo/'


        if !isdirectory(l:parent)
          call mkdir(l:parent)
        endif
        if !isdirectory(l:backup)
          call mkdir(l:backup)
        endif
        if !isdirectory(l:tmpdir)
          call mkdir(l:tmpdir)
        endif
        if !isdirectory(l:undodir)
          call mkdir(l:undodir)
        endif
      endfunction
      call InitBackupDir()

      augroup Binary
        " edit binaries in xxd-output, xxd is part of vim
        au!
        au BufReadPre  *.bin let &bin=1
        au BufReadPost *.bin if &bin | %!xxd
        au BufReadPost *.bin set ft=xxd | endif
        au BufWritePre *.bin if &bin | %!xxd -r
        au BufWritePre *.bin endif
        au BufWritePost *.bin if &bin | %!xxd
        au BufWritePost *.bin set nomod | endif
      augroup END



    '';

      vimrcConfig.vam.knownPlugins = pkgs.vimPlugins // customPlugins;
      vimrcConfig.vam.pluginDictionaries = [
        { names = [ "undotree"
          "YouCompleteMe"
          "vim-better-whitespace" ]; }
        { names = [ "vim-addon-nix" ]; ft_regex = "^nix\$"; }
      ];

    })
  ];
}