2016-06-21 18:40:20 +00:00
|
|
|
|
{ config, lib, pkgs, ... }:
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
|
|
|
|
let
|
2016-06-21 18:40:20 +00:00
|
|
|
|
out = {
|
|
|
|
|
environment.systemPackages = [
|
2023-09-03 10:33:23 +00:00
|
|
|
|
(lib.hiPrio vim)
|
2016-06-21 18:40:20 +00:00
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
environment.etc.vimrc.source = vimrc;
|
2023-09-03 10:33:23 +00:00
|
|
|
|
environment.etc.vim.source = vim;
|
2016-06-21 18:40:20 +00:00
|
|
|
|
|
2023-09-03 10:33:23 +00:00
|
|
|
|
environment.variables.EDITOR = lib.mkForce "vim";
|
2016-06-21 18:40:20 +00:00
|
|
|
|
environment.variables.VIMINIT = ":so /etc/vimrc";
|
2015-07-16 13:51:01 +00:00
|
|
|
|
};
|
|
|
|
|
|
2017-01-16 16:29:20 +00:00
|
|
|
|
vimrc = pkgs.writeText "vimrc" ''
|
|
|
|
|
set nocompatible
|
|
|
|
|
|
|
|
|
|
set autoindent
|
|
|
|
|
set backspace=indent,eol,start
|
|
|
|
|
set backup
|
|
|
|
|
set backupdir=${dirs.backupdir}/
|
|
|
|
|
set directory=${dirs.swapdir}//
|
2022-05-29 18:08:21 +00:00
|
|
|
|
set list listchars=tab:⇥\ ,extends:❯,precedes:❮,nbsp:␣,trail:· showbreak=¬
|
2017-01-16 16:29:20 +00:00
|
|
|
|
set hlsearch
|
|
|
|
|
set incsearch
|
2021-10-25 18:27:26 +00:00
|
|
|
|
set ttymouse=sgr
|
2017-01-16 16:29:20 +00:00
|
|
|
|
set mouse=a
|
2017-02-17 15:12:12 +00:00
|
|
|
|
set ruler
|
2017-01-16 16:29:20 +00:00
|
|
|
|
set pastetoggle=<INS>
|
|
|
|
|
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
|
|
|
|
|
|
2023-09-03 10:33:23 +00:00
|
|
|
|
" enable better-whitespace
|
|
|
|
|
let g:better_whitespace_enabled=1
|
|
|
|
|
|
2017-01-17 14:47:41 +00:00
|
|
|
|
set title
|
|
|
|
|
set titleold=
|
|
|
|
|
set titlestring=(vim)\ %t%(\ %M%)%(\ (%{expand(\"%:p:h\")})%)%(\ %a%)\ -\ %{v:servername}
|
|
|
|
|
|
2017-01-16 16:29:20 +00:00
|
|
|
|
set et ts=2 sts=2 sw=2
|
|
|
|
|
|
|
|
|
|
filetype plugin indent on
|
|
|
|
|
|
|
|
|
|
set t_Co=256
|
2022-05-29 18:08:10 +00:00
|
|
|
|
colorscheme dim
|
2017-01-16 16:29:20 +00:00
|
|
|
|
syntax on
|
|
|
|
|
|
|
|
|
|
au Syntax * syn match Garbage containedin=ALL /\s\+$/
|
|
|
|
|
\ | syn match TabStop containedin=ALL /\t\+/
|
|
|
|
|
\ | syn keyword Todo containedin=ALL TODO
|
2018-10-10 18:13:07 +00:00
|
|
|
|
\ | syn match NBSP '\%xa0'
|
|
|
|
|
\ | syn match NarrowNBSP '\%u202F'
|
2017-01-16 16:29:20 +00:00
|
|
|
|
|
|
|
|
|
au BufRead,BufNewFile *.hs so ${hs.vim}
|
|
|
|
|
|
|
|
|
|
au BufRead,BufNewFile *.nix so ${nix.vim}
|
|
|
|
|
|
|
|
|
|
au BufRead,BufNewFile /dev/shm/* set nobackup nowritebackup noswapfile
|
|
|
|
|
|
2018-07-09 17:02:13 +00:00
|
|
|
|
nnoremap <F5> :call LanguageClient_contextMenu()<CR>
|
|
|
|
|
set hidden
|
|
|
|
|
let g:LanguageClient_serverCommands = {
|
|
|
|
|
\ 'python': ['pyls'],
|
|
|
|
|
\ 'go': ['~/go/bin/go-langserver']
|
|
|
|
|
\ }
|
|
|
|
|
|
2019-05-20 11:30:22 +00:00
|
|
|
|
let g:LanguageClient_diagnosticsDisplay = {
|
|
|
|
|
\ 1: { "signText": "E" },
|
|
|
|
|
\ 2: { "signText": "W" }
|
|
|
|
|
\ }
|
2018-02-19 08:50:45 +00:00
|
|
|
|
|
2017-01-16 16:29:20 +00:00
|
|
|
|
nmap <esc>q :buffer
|
|
|
|
|
nmap <M-q> :buffer
|
|
|
|
|
|
|
|
|
|
cnoremap <C-A> <Home>
|
|
|
|
|
|
|
|
|
|
noremap <C-c> :q<cr>
|
|
|
|
|
vnoremap < <gv
|
|
|
|
|
vnoremap > >gv
|
|
|
|
|
|
|
|
|
|
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>
|
2017-10-09 11:24:54 +00:00
|
|
|
|
|
2017-11-12 12:19:36 +00:00
|
|
|
|
" search with ack
|
2017-10-09 11:24:54 +00:00
|
|
|
|
let g:ackprg = 'ag --vimgrep'
|
|
|
|
|
cnoreabbrev Ack Ack!
|
2017-11-12 12:19:36 +00:00
|
|
|
|
|
|
|
|
|
" copy/paste from/to xclipboard
|
|
|
|
|
set clipboard=unnamedplus
|
2022-05-29 18:08:35 +00:00
|
|
|
|
|
|
|
|
|
" use fzf to switch files
|
|
|
|
|
nnoremap <C-p> :FZF<CR>
|
|
|
|
|
nnoremap <C-l> :Rg<CR>
|
|
|
|
|
let g:fzf_layout = { 'down': '~15%' }
|
2017-01-16 16:29:20 +00:00
|
|
|
|
'';
|
|
|
|
|
|
2023-09-03 10:33:23 +00:00
|
|
|
|
extra-runtimepath = lib.concatMapStringsSep "," (pkg: "${pkg.rtp}") [
|
|
|
|
|
pkgs.vimPlugins.copilot-vim
|
2016-06-22 17:22:34 +00:00
|
|
|
|
pkgs.vimPlugins.undotree
|
2022-05-29 18:08:35 +00:00
|
|
|
|
pkgs.vimPlugins.fzf-vim
|
|
|
|
|
pkgs.vimPlugins.fzfWrapper
|
2023-09-03 10:33:23 +00:00
|
|
|
|
pkgs.vimPlugins.vim-better-whitespace
|
2016-06-21 18:40:20 +00:00
|
|
|
|
(pkgs.vimUtils.buildVimPlugin {
|
|
|
|
|
name = "file-line-1.0";
|
2017-09-18 13:04:25 +00:00
|
|
|
|
src = pkgs.fetchFromGitHub {
|
|
|
|
|
owner = "bogado";
|
|
|
|
|
repo = "file-line";
|
|
|
|
|
rev = "1.0";
|
2016-06-21 18:40:20 +00:00
|
|
|
|
sha256 = "0z47zq9rqh06ny0q8lpcdsraf3lyzn9xvb59nywnarf3nxrk6hx0";
|
|
|
|
|
};
|
|
|
|
|
})
|
2022-05-29 18:08:10 +00:00
|
|
|
|
(pkgs.vimUtils.buildVimPlugin {
|
|
|
|
|
name = "vim-dim-1.1.0";
|
|
|
|
|
src = pkgs.fetchFromGitHub {
|
|
|
|
|
owner = "jeffkreeftmeijer";
|
|
|
|
|
repo = "vim-dim";
|
|
|
|
|
rev = "1.1.0";
|
|
|
|
|
sha256 = "sha256-lyTZUgqUEEJRrzGo1FD8/t8KBioPrtB3MmGvPeEVI/g=";
|
|
|
|
|
};
|
|
|
|
|
})
|
2016-06-21 18:40:20 +00:00
|
|
|
|
((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
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
2016-06-21 18:40:20 +00:00
|
|
|
|
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
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
2016-06-21 18:40:20 +00:00
|
|
|
|
command! -n=0 -bar ShowSyntax :call ShowSyntax()
|
|
|
|
|
'';
|
|
|
|
|
})))
|
|
|
|
|
];
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
2016-06-21 18:40:20 +00:00
|
|
|
|
dirs = {
|
|
|
|
|
backupdir = "$HOME/.cache/vim/backup";
|
|
|
|
|
swapdir = "$HOME/.cache/vim/swap";
|
|
|
|
|
undodir = "$HOME/.cache/vim/undo";
|
|
|
|
|
};
|
|
|
|
|
files = {
|
|
|
|
|
viminfo = "$HOME/.cache/vim/info";
|
|
|
|
|
};
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
2016-06-21 18:40:20 +00:00
|
|
|
|
mkdirs = let
|
2023-09-03 10:33:23 +00:00
|
|
|
|
dirOf = s: let out = lib.concatStringsSep "/" (lib.init (lib.splitString "/" s));
|
2016-06-21 18:40:20 +00:00
|
|
|
|
in assert out != ""; out;
|
2023-09-03 10:33:23 +00:00
|
|
|
|
alldirs = lib.attrValues dirs ++ map dirOf (lib.attrValues files);
|
|
|
|
|
in lib.unique (lib.sort lib.lessThan alldirs);
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
2017-06-20 17:30:14 +00:00
|
|
|
|
vim = pkgs.symlinkJoin {
|
|
|
|
|
name = "vim";
|
|
|
|
|
paths = [
|
2023-09-03 10:33:23 +00:00
|
|
|
|
(pkgs.writers.writeDashBin "vim" ''
|
2017-06-20 17:30:14 +00:00
|
|
|
|
set -efu
|
2023-09-03 10:33:23 +00:00
|
|
|
|
export PATH=$PATH:${lib.makeBinPath [
|
|
|
|
|
pkgs.nodejs
|
|
|
|
|
]}
|
2017-06-20 17:30:14 +00:00
|
|
|
|
(umask 0077; exec ${pkgs.coreutils}/bin/mkdir -p ${toString mkdirs})
|
|
|
|
|
exec ${pkgs.vim}/bin/vim "$@"
|
|
|
|
|
'')
|
2017-08-07 12:59:04 +00:00
|
|
|
|
pkgs.vim
|
2017-06-20 17:30:14 +00:00
|
|
|
|
];
|
|
|
|
|
};
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
2016-06-21 18:40:20 +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
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
nix.vim = pkgs.writeText "nix.vim" ''
|
|
|
|
|
setf nix
|
|
|
|
|
|
|
|
|
|
" Ref <nix/src/libexpr/lexer.l>
|
|
|
|
|
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="'''"
|
|
|
|
|
|
|
|
|
|
syn match NixOther /[():/;=.,?\[\]]/
|
|
|
|
|
|
|
|
|
|
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 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
|
|
|
|
|
hi link NixOther NixCode
|
|
|
|
|
hi link NixQuote NixData
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
2023-09-03 10:33:23 +00:00
|
|
|
|
${lib.concatStringsSep "\n" (lib.mapAttrsToList (lang: { extraStart ? null }: let
|
|
|
|
|
startAlts = lib.filter lib.isString [
|
2016-06-21 18:40:20 +00:00
|
|
|
|
''/\* ${lang} \*/''
|
|
|
|
|
extraStart
|
2015-07-16 13:51:01 +00:00
|
|
|
|
];
|
2023-09-03 10:33:23 +00:00
|
|
|
|
sigil = ''\(${lib.concatStringsSep ''\|'' startAlts}\)[ \t\r\n]*'';
|
2016-06-21 18:40:20 +00:00
|
|
|
|
in /* vim */ ''
|
|
|
|
|
syn include @nix_${lang}_syntax syntax/${lang}.vim
|
|
|
|
|
unlet b:current_syntax
|
2015-07-16 13:51:01 +00:00
|
|
|
|
|
2016-06-21 18:40:20 +00:00
|
|
|
|
syn match nix_${lang}_sigil
|
2023-09-03 10:33:23 +00:00
|
|
|
|
\ X${lib.replaceStrings ["X"] ["\\X"] sigil}\ze\('''\|"\)X
|
2016-06-21 18:40:20 +00:00
|
|
|
|
\ nextgroup=nix_${lang}_region_IND_STRING,nix_${lang}_region_STRING
|
|
|
|
|
\ transparent
|
|
|
|
|
|
|
|
|
|
syn region nix_${lang}_region_STRING
|
|
|
|
|
\ matchgroup=NixSTRING
|
|
|
|
|
\ start='"'
|
|
|
|
|
\ skip='\\"'
|
|
|
|
|
\ end='"'
|
|
|
|
|
\ contained
|
|
|
|
|
\ contains=@nix_${lang}_syntax
|
|
|
|
|
\ transparent
|
|
|
|
|
|
|
|
|
|
syn region nix_${lang}_region_IND_STRING
|
|
|
|
|
\ matchgroup=NixIND_STRING
|
|
|
|
|
\ start="'''"
|
|
|
|
|
\ skip="'''\('\|[$]\|\\[nrt]\)"
|
|
|
|
|
\ end="'''"
|
|
|
|
|
\ contained
|
|
|
|
|
\ contains=@nix_${lang}_syntax
|
|
|
|
|
\ transparent
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
'') {
|
|
|
|
|
c = {};
|
|
|
|
|
cabal = {};
|
|
|
|
|
haskell = {};
|
|
|
|
|
sh.extraStart = ''write\(Ba\|Da\)sh[^ \t\r\n]*[ \t\r\n]*"[^"]*"'';
|
|
|
|
|
vim.extraStart =
|
|
|
|
|
''write[^ \t\r\n]*[ \t\r\n]*"\(\([^"]*\.\)\?vimrc\|[^"]*\.vim\)"'';
|
|
|
|
|
})}
|
|
|
|
|
|
|
|
|
|
" Clear syntax that interferes with nixINSIDE_DOLLAR_CURLY.
|
|
|
|
|
syn clear shVarAssign
|
|
|
|
|
|
|
|
|
|
syn region nixINSIDE_DOLLAR_CURLY
|
|
|
|
|
\ matchgroup=NixEnter
|
|
|
|
|
\ start="[$]{"
|
|
|
|
|
\ end="}"
|
|
|
|
|
\ contains=TOP
|
|
|
|
|
\ containedin=@nix_has_dollar_curly
|
|
|
|
|
\ transparent
|
|
|
|
|
|
|
|
|
|
syn region nix_inside_curly
|
|
|
|
|
\ matchgroup=NixEnter
|
|
|
|
|
\ start="{"
|
|
|
|
|
\ end="}"
|
|
|
|
|
\ contains=TOP
|
|
|
|
|
\ containedin=nixINSIDE_DOLLAR_CURLY,nix_inside_curly
|
|
|
|
|
\ transparent
|
|
|
|
|
|
|
|
|
|
syn match NixQuote /'''\([''$']\|\\.\)/he=s+2
|
|
|
|
|
\ containedin=@nix_ind_strings
|
|
|
|
|
\ contained
|
|
|
|
|
|
|
|
|
|
syn match NixQuote /\\./he=s+1
|
|
|
|
|
\ containedin=@nix_strings
|
|
|
|
|
\ contained
|
|
|
|
|
|
|
|
|
|
syn sync fromstart
|
|
|
|
|
|
|
|
|
|
let b:current_syntax = "nix"
|
|
|
|
|
|
|
|
|
|
set isk=@,48-57,_,192-255,-,'
|
|
|
|
|
'';
|
|
|
|
|
in
|
|
|
|
|
out
|