stockholm/tv/2configs/vim.nix

331 lines
9.0 KiB
Nix
Raw Normal View History

2016-02-14 15:43:44 +00:00
{ config, lib, pkgs, ... }:
2015-11-01 09:50:03 +00:00
2016-02-14 15:43:44 +00:00
with config.krebs.lib;
2015-11-01 09:50:03 +00:00
let
out = {
environment.systemPackages = [
2015-12-27 18:33:12 +00:00
vim
2015-11-01 09:50:03 +00:00
];
2015-11-01 12:59:53 +00:00
environment.etc.vimrc.source = vimrc;
2015-11-01 09:50:03 +00:00
environment.variables.EDITOR = mkForce "vim";
2015-11-01 12:59:53 +00:00
environment.variables.VIMINIT = ":so /etc/vimrc";
2015-11-01 09:50:03 +00:00
};
extra-runtimepath = concatMapStringsSep "," (pkg: "${pkg.rtp}") [
pkgs.vimPlugins.undotree
(pkgs.vimUtils.buildVimPlugin {
2016-02-07 06:47:29 +00:00
name = "file-line-1.0";
src = pkgs.fetchgit {
url = git://github.com/bogado/file-line;
rev = "refs/tags/1.0";
sha256 = "0z47zq9rqh06ny0q8lpcdsraf3lyzn9xvb59nywnarf3nxrk6hx0";
};
})
2016-06-09 02:22:46 +00:00
((rtp: rtp // { inherit rtp; }) (pkgs.writeTextFile (let
name = "hack";
in {
2016-06-10 11:55:12 +00:00
name = "vim-color-${name}-1.0.2";
2016-06-09 02:22:46 +00:00
destination = "/colors/${name}.vim";
text = /* vim */ ''
set background=dark
hi clear
if exists("syntax_on")
syntax clear
endif
let colors_name = ${toJSON name}
2016-06-09 12:30:19 +00:00
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
2016-06-09 02:22:46 +00:00
2016-06-09 12:30:19 +00:00
hi Garbage ctermbg=088
hi TabStop ctermbg=016
2016-06-10 11:55:12 +00:00
hi Todo ctermfg=174 ctermbg=NONE
2016-06-09 12:30:19 +00:00
hi NixCode ctermfg=040
hi NixData ctermfg=046
2016-06-10 14:28:27 +00:00
hi NixQuote ctermfg=071
2016-06-09 12:30:19 +00:00
hi diffNewFile ctermfg=207
hi diffFile ctermfg=207
hi diffLine ctermfg=207
hi diffSubname ctermfg=207
hi diffAdded ctermfg=010
hi diffRemoved ctermfg=009
2016-06-09 02:22:46 +00:00
'';
})))
2016-06-09 11:22:47 +00:00
((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))}
'';
})))
((rtp: rtp // { inherit rtp; }) (pkgs.writeTextFile (let
name = "showsyntax";
in {
name = "vim-plugin-${name}-1.0.0";
destination = "/plugin/${name}.vim";
text = /* vim */ ''
if exists('g:loaded_showsyntax')
finish
endif
let g:loaded_showsyntax = 0
fu! ShowSyntax()
let id = synID(line("."), col("."), 1)
let name = synIDattr(id, "name")
let transName = synIDattr(synIDtrans(id),"name")
if name != transName
let name .= " (" . transName . ")"
endif
echo "Syntax: " . name
endfu
command! -n=0 -bar ShowSyntax :call ShowSyntax()
'';
})))
];
2015-11-01 09:50:03 +00:00
2015-12-27 18:33:12 +00:00
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);
2016-02-07 07:09:07 +00:00
vim = pkgs.writeDashBin "vim" ''
set -efu
(umask 0077; exec ${pkgs.coreutils}/bin/mkdir -p ${toString mkdirs})
2015-12-27 18:33:12 +00:00
exec ${pkgs.vim}/bin/vim "$@"
'';
2015-11-01 09:50:03 +00:00
vimrc = pkgs.writeText "vimrc" ''
set nocompatible
set autoindent
set backspace=indent,eol,start
set backup
2015-12-27 18:33:12 +00:00
set backupdir=${dirs.backupdir}/
set directory=${dirs.swapdir}//
2015-11-01 09:50:03 +00:00
set hlsearch
set incsearch
set mouse=a
2015-11-01 12:21:35 +00:00
set noruler
2015-11-01 09:50:03 +00:00
set pastetoggle=<INS>
set runtimepath=${extra-runtimepath},$VIMRUNTIME
2015-11-01 09:50:03 +00:00
set shortmess+=I
set showcmd
set showmatch
set ttimeoutlen=0
2015-12-27 18:33:12 +00:00
set undodir=${dirs.undodir}
2015-11-01 09:50:03 +00:00
set undofile
set undolevels=1000000
set undoreload=1000000
2015-12-27 18:33:12 +00:00
set viminfo='20,<1000,s100,h,n${files.viminfo}
2015-11-01 09:50:03 +00:00
set visualbell
set wildignore+=*.o,*.class,*.hi,*.dyn_hi,*.dyn_o
set wildmenu
set wildmode=longest,full
2015-11-04 23:31:14 +00:00
set et ts=2 sts=2 sw=2
2015-11-01 09:50:03 +00:00
filetype plugin indent on
2015-11-01 12:17:11 +00:00
set t_Co=256
2016-06-09 02:22:46 +00:00
colorscheme hack
2015-11-01 09:50:03 +00:00
syntax on
2016-06-10 11:54:50 +00:00
au Syntax * syn match Garbage containedin=ALL /\s\+$/
\ | syn match TabStop containedin=ALL /\t\+/
\ | syn keyword Todo containedin=ALL TODO
2015-11-01 09:50:03 +00:00
2016-06-08 22:53:41 +00:00
au BufRead,BufNewFile *.hs so ${hs.vim}
au BufRead,BufNewFile *.nix so ${nix.vim}
2015-11-01 12:13:07 +00:00
2015-11-01 12:22:43 +00:00
au BufRead,BufNewFile /dev/shm/* set nobackup nowritebackup noswapfile
2015-11-01 09:50:03 +00:00
nmap <esc>q :buffer
nmap <M-q> :buffer
cnoremap <C-A> <Home>
noremap <C-c> :q<cr>
nnoremap <esc>[5^ :tabp<cr>
nnoremap <esc>[6^ :tabn<cr>
nnoremap <esc>[5@ :tabm -1<cr>
nnoremap <esc>[6@ :tabm +1<cr>
nnoremap <f1> :tabp<cr>
nnoremap <f2> :tabn<cr>
inoremap <f1> <esc>:tabp<cr>
inoremap <f2> <esc>:tabn<cr>
" <C-{Up,Down,Right,Left>
noremap <esc>Oa <nop> | noremap! <esc>Oa <nop>
noremap <esc>Ob <nop> | noremap! <esc>Ob <nop>
noremap <esc>Oc <nop> | noremap! <esc>Oc <nop>
noremap <esc>Od <nop> | noremap! <esc>Od <nop>
" <[C]S-{Up,Down,Right,Left>
noremap <esc>[a <nop> | noremap! <esc>[a <nop>
noremap <esc>[b <nop> | noremap! <esc>[b <nop>
noremap <esc>[c <nop> | noremap! <esc>[c <nop>
noremap <esc>[d <nop> | noremap! <esc>[d <nop>
vnoremap u <nop>
'';
2016-06-08 22:53:41 +00:00
hs.vim = pkgs.writeText "hs.vim" ''
syn region String start=+\[[[:alnum:]]*|+ end=+|]+
hi link ConId Identifier
hi link VarId Identifier
hi link hsDelimiter Delimiter
2016-06-08 22:53:41 +00:00
'';
nix.vim = pkgs.writeText "nix.vim" ''
setf nix
syn match NixCode /./
2016-06-08 22:53:41 +00:00
" Ref <nix/src/libexpr/lexer.l>
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 region NixSTRING
\ matchgroup=NixSTRING
\ start='"'
\ skip='\\"'
\ end='"'
syn region NixIND_STRING
\ matchgroup=NixIND_STRING
\ start="'''"
\ skip="'''\('\|[$]\|\\[nrt]\)"
\ end="'''"
syn cluster NixStrings contains=NixSTRING,NixIND_STRING
syn match NixCommentMatch /\(^\|\s\)#.*/
syn region NixCommentRegion start="/\*" end="\*/"
2016-06-09 12:29:05 +00:00
hi link NixCode Statement
hi link NixData Constant
hi link NixComment Comment
2016-06-09 12:29:05 +00:00
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 NixIND_STRING NixData
hi link NixEnter NixCode
hi link NixExit NixData
2016-06-09 03:44:26 +00:00
hi link NixQuote NixData
hi link NixQuote2 NixQuote
hi link NixQuote3 NixQuote
syn cluster NixSubLangs contains=NONE
${concatStringsSep "\n" (mapAttrsToList (lang: { extraStart ? null }: let
startAlts = filter isString [
''/\* ${lang} \*/''
extraStart
];
sigil = ''\(${concatStringsSep ''\|'' startAlts}\)[ \t\r\n]*'';
2016-06-09 03:44:26 +00:00
in /* vim */ ''
2016-06-12 14:33:39 +00:00
syn include @nix_${lang}_syntax syntax/${lang}.vim
unlet b:current_syntax
2016-06-12 14:33:39 +00:00
syn match nix_${lang}_sigil
\ X${replaceStrings ["X"] ["\\X"] sigil}\ze\('''\|"\)X
\ nextgroup=nix_${lang}_region
\ transparent
syn region nix_${lang}_region
\ matchgroup=NixSTRING
\ start='"'
\ skip='\\"'
\ end='"'
2016-06-12 14:33:39 +00:00
\ contained
\ contains=@nix_${lang}_syntax
2016-06-12 14:33:39 +00:00
syn region nix_${lang}_region
\ matchgroup=NixIND_STRING
\ start="'''"
2016-06-09 03:44:26 +00:00
\ skip="'''\('\|[$]\|\\[nrt]\)"
\ end="'''"
2016-06-12 14:33:39 +00:00
\ contained
\ contains=@nix_${lang}_syntax
syn cluster NixSubLangs
2016-06-12 14:33:39 +00:00
\ add=nix_${lang}_region,@nix_${lang}_syntax
2016-06-09 03:44:26 +00:00
'') {
2016-06-10 11:56:15 +00:00
c = {};
cabal = {};
2016-06-09 03:44:26 +00:00
haskell = {};
sh.extraStart = ''write\(Ba\|Da\)sh[^ \t\r\n]*[ \t\r\n]*"[^"]*"'';
vim.extraStart =
''write[^ \t\r\n]*[ \t\r\n]*"\(\([^"]*\.\)\?vimrc\|[^"]*\.vim\)"'';
2016-06-09 03:44:26 +00:00
})}
" Clear syntax that interferes with NixBlock.
2016-06-10 14:10:35 +00:00
" TODO redefine NixBlock so syntax don't have to be cleared
syn clear shOperator shSetList shVarAssign
syn region NixBlock
\ matchgroup=NixEnter
\ start="[$]{"
\ end="}"
2016-06-09 03:44:26 +00:00
\ contains=TOP
\ containedin=@NixSubLangs,@NixStrings
2016-06-09 03:44:26 +00:00
syn region NixBlockHack
\ matchgroup=NixEnter
2016-06-09 03:44:26 +00:00
\ 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
2016-06-08 22:53:41 +00:00
2016-06-09 20:05:32 +00:00
syn sync fromstart
2016-06-08 22:53:41 +00:00
let b:current_syntax = "nix"
2016-06-09 20:05:14 +00:00
set isk=@,48-57,_,192-255,-,'
2016-06-08 22:53:41 +00:00
'';
2015-11-01 09:50:03 +00:00
in
out