{ config, lib, pkgs, ... }: with config.krebs.lib; let out = { environment.systemPackages = [ vim ]; environment.etc.vimrc.source = vimrc; environment.variables.EDITOR = mkForce "vim"; environment.variables.VIMINIT = ":so /etc/vimrc"; }; extra-runtimepath = concatMapStringsSep "," (pkg: "${pkg.rtp}") [ pkgs.vimPlugins.undotree (pkgs.vimUtils.buildVimPlugin { name = "file-line-1.0"; src = pkgs.fetchgit { url = git://github.com/bogado/file-line; rev = "refs/tags/1.0"; sha256 = "0z47zq9rqh06ny0q8lpcdsraf3lyzn9xvb59nywnarf3nxrk6hx0"; }; }) ((rtp: rtp // { inherit rtp; }) (pkgs.writeTextFile (let name = "hack"; in { name = "vim-color-${name}-1.0.1"; destination = "/colors/${name}.vim"; text = /* vim */ '' set background=dark hi clear if exists("syntax_on") syntax clear endif let colors_name = ${toJSON name} hi Normal ctermbg=235 hi Comment ctermfg=242 hi Constant ctermfg=255 hi Identifier ctermfg=253 hi Function ctermfg=253 hi Statement ctermfg=253 hi PreProc ctermfg=251 hi Type ctermfg=251 hi Delimiter ctermfg=251 hi Special ctermfg=255 hi Garbage ctermbg=088 hi TabStop ctermbg=016 hi NixCode ctermfg=040 hi NixData ctermfg=046 hi diffNewFile ctermfg=207 hi diffFile ctermfg=207 hi diffLine ctermfg=207 hi diffSubname ctermfg=207 hi diffAdded ctermfg=010 hi diffRemoved ctermfg=009 ''; }))) ((rtp: rtp // { inherit rtp; }) (pkgs.writeTextFile (let name = "vim"; in { name = "vim-syntax-${name}-1.0.0"; destination = "/syntax/${name}.vim"; text = /* vim */ '' ${concatMapStringsSep "\n" (s: /* vim */ '' syn keyword vimColor${s} ${s} \ containedin=ALLBUT,vimComment,vimLineComment hi vimColor${s} ctermfg=${s} '') (map (i: lpad 3 "0" (toString i)) (range 0 255))} ''; }))) ]; dirs = { backupdir = "$HOME/.cache/vim/backup"; swapdir = "$HOME/.cache/vim/swap"; undodir = "$HOME/.cache/vim/undo"; }; files = { viminfo = "$HOME/.cache/vim/info"; }; mkdirs = let dirOf = s: let out = concatStringsSep "/" (init (splitString "/" s)); in assert out != ""; out; alldirs = attrValues dirs ++ map dirOf (attrValues files); in unique (sort lessThan alldirs); vim = pkgs.writeDashBin "vim" '' set -efu (umask 0077; exec ${pkgs.coreutils}/bin/mkdir -p ${toString mkdirs}) exec ${pkgs.vim}/bin/vim "$@" ''; vimrc = pkgs.writeText "vimrc" '' set nocompatible set autoindent set backspace=indent,eol,start set backup set backupdir=${dirs.backupdir}/ set directory=${dirs.swapdir}// set hlsearch set incsearch set mouse=a set noruler set pastetoggle= set runtimepath=${extra-runtimepath},$VIMRUNTIME set shortmess+=I set showcmd set showmatch set ttimeoutlen=0 set undodir=${dirs.undodir} set undofile set undolevels=1000000 set undoreload=1000000 set viminfo='20,<1000,s100,h,n${files.viminfo} set visualbell set wildignore+=*.o,*.class,*.hi,*.dyn_hi,*.dyn_o set wildmenu set wildmode=longest,full set et ts=2 sts=2 sw=2 filetype plugin indent on set t_Co=256 colorscheme hack syntax on au Syntax * syn match TabStop containedin=ALL /\t\+/ \ | syn match Garbage containedin=ALL /\s\+$/ au BufRead,BufNewFile *.hs so ${hs.vim} au BufRead,BufNewFile *.nix so ${nix.vim} au BufRead,BufNewFile /dev/shm/* set nobackup nowritebackup noswapfile nmap q :buffer nmap :buffer cnoremap noremap :q nnoremap [5^ :tabp nnoremap [6^ :tabn nnoremap [5@ :tabm -1 nnoremap [6@ :tabm +1 nnoremap :tabp nnoremap :tabn inoremap :tabp inoremap :tabn " noremap Oa | noremap! Oa noremap Ob | noremap! Ob noremap Oc | noremap! Oc noremap Od | noremap! Od " <[C]S-{Up,Down,Right,Left> noremap [a | noremap! [a noremap [b | noremap! [b noremap [c | noremap! [c noremap [d | noremap! [d vnoremap u ''; hs.vim = pkgs.writeText "hs.vim" '' syn region String start=+\[[[:alnum:]]*|+ end=+|]+ hi link ConId Identifier hi link VarId Identifier hi link hsDelimiter Delimiter ''; nix.vim = pkgs.writeText "nix.vim" '' setf nix set isk=@,48-57,_,192-255,-,' syn match NixCode /./ " Ref syn match NixINT /\<[0-9]\+\>/ syn match NixPATH /[a-zA-Z0-9\.\_\-\+]*\(\/[a-zA-Z0-9\.\_\-\+]\+\)\+/ syn match NixHPATH /\~\(\/[a-zA-Z0-9\.\_\-\+]\+\)\+/ syn match NixSPATH /<[a-zA-Z0-9\.\_\-\+]\+\(\/[a-zA-Z0-9\.\_\-\+]\+\)*>/ syn match NixURI /[a-zA-Z][a-zA-Z0-9\+\-\.]*:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']\+/ syn match NixString /"\([^\\"]\|\\.\)*"/ syn match NixCommentMatch /\(^\|\s\)#.*/ syn region NixCommentRegion start="/\*" end="\*/" hi link NixCode Statement hi link NixData Constant hi link NixComment Comment hi link NixCommentMatch NixComment hi link NixCommentRegion NixComment hi link NixINT NixData hi link NixPATH NixData hi link NixHPATH NixData hi link NixSPATH NixData hi link NixURI NixData hi link NixString NixData hi link NixEnter NixCode hi link NixExit NixData hi link NixQuote NixData hi link NixQuote2 NixQuote hi link NixQuote3 NixQuote syn cluster NixSubLangs contains=NONE ${concatStringsSep "\n" (mapAttrsToList (name: { start ? null }: let in /* vim */ '' syn include @${name}Syntax syntax/${name}.vim syn region ${name}Block \ matchgroup=NixExit \ start="\(/\* ${name} \*/${optionalString (start != null) ''\|${start}''}\) '''" \ skip="'''\('\|[$]\|\\[nrt]\)" \ end="'''" \ contains=@${name}Syntax syn cluster NixSubLangs add=${name}Block,@${name}Syntax unlet b:current_syntax hi link ${name}Block Statement '') { haskell = {}; sh.start = ''write\(Ba\|Da\)sh[^ ]* *\"[^\"]*\"''; vim.start = ''write[^ ]* *\"\(\([^\"]*\.\)\?vimrc\|[^\"]*\.vim\)\"''; })} syn region NixBlock \ matchgroup=NixEnter \ start="[$]{" \ end="}" \ contains=TOP \ containedin=@NixSubLangs syn region NixBlockHack \ start="{" \ end="}" \ contains=TOP syn match NixQuote "'''[$]"he=e-1 contained containedin=@NixSubLangs syn match NixQuote2 "''''"he=s+1 contained containedin=@NixSubLangs syn match NixQuote3 "'''\\[nrt]" contained containedin=@NixSubLangs let b:current_syntax = "nix" ''; in out