stockholm/tv/2configs/vim.nix

341 lines
9.3 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
" Ref <nix/src/libexpr/lexer.l>
2016-06-12 19:14:03 +00:00
syn match NixID /[a-zA-Z\_][a-zA-Z0-9\_\'\-]*/
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="'''"
2016-06-12 19:14:03 +00:00
syn match NixOther /[():/;=.,?\[\]]/
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
2016-06-12 19:14:03 +00:00
hi link NixID NixCode
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
2016-06-12 19:14:03 +00:00
hi link NixOther NixCode
2016-06-09 03:44:26 +00:00
hi link NixQuote NixData
2016-06-12 19:25:03 +00:00
syn cluster nix_has_dollar_curly contains=@nix_ind_strings,@nix_strings
syn cluster nix_ind_strings contains=NixIND_STRING
syn cluster nix_strings contains=NixSTRING
2016-06-09 03:44:26 +00:00
${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
2016-06-12 19:25:03 +00:00
\ nextgroup=nix_${lang}_region_IND_STRING,nix_${lang}_region_STRING
2016-06-12 14:33:39 +00:00
\ transparent
2016-06-12 19:25:03 +00:00
syn region nix_${lang}_region_STRING
2016-06-12 14:33:39 +00:00
\ matchgroup=NixSTRING
\ start='"'
\ skip='\\"'
\ end='"'
2016-06-12 14:33:39 +00:00
\ contained
\ contains=@nix_${lang}_syntax
2016-06-12 19:25:03 +00:00
syn region nix_${lang}_region_IND_STRING
2016-06-12 14:33:39 +00:00
\ 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
2016-06-12 19:25:03 +00:00
syn cluster nix_ind_strings
\ add=nix_${lang}_region_IND_STRING
syn cluster nix_strings
\ add=nix_${lang}_region_STRING
syn cluster nix_has_dollar_curly
\ add=@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
2016-06-12 19:25:03 +00:00
\ containedin=@nix_has_dollar_curly
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
2016-06-12 19:25:03 +00:00
syn match NixQuote /'''\([''$']\|\\.\)/he=s+2
\ containedin=@nix_ind_strings
\ contained
syn match NixQuote /\\./he=s+1
\ containedin=@nix_strings
\ contained
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