···
4
4
./binary-cache/client.nix
5
5
./gc.nix
6
6
./mc.nix
7
7
-
./vim.nix
8
7
./zsh.nix
9
8
./htop.nix
10
9
./wiregrill.nix
···
1
1
-
{ config, lib, pkgs, ... }:
2
2
-
3
3
-
let
4
4
-
out = {
5
5
-
environment.systemPackages = [
6
6
-
(lib.hiPrio vim)
7
7
-
];
8
8
-
9
9
-
environment.etc.vimrc.source = vimrc;
10
10
-
environment.etc.vim.source = vim;
11
11
-
12
12
-
environment.variables.EDITOR = lib.mkForce "vim";
13
13
-
environment.variables.VIMINIT = ":so /etc/vimrc";
14
14
-
};
15
15
-
16
16
-
vimrc = pkgs.writeText "vimrc" ''
17
17
-
set nocompatible
18
18
-
19
19
-
set autoindent
20
20
-
set backspace=indent,eol,start
21
21
-
set backup
22
22
-
set backupdir=${dirs.backupdir}/
23
23
-
set directory=${dirs.swapdir}//
24
24
-
set list listchars=tab:⇥\ ,extends:❯,precedes:❮,nbsp:␣,trail:· showbreak=¬
25
25
-
set hlsearch
26
26
-
set incsearch
27
27
-
set ttymouse=sgr
28
28
-
set mouse=a
29
29
-
set ruler
30
30
-
set pastetoggle=<INS>
31
31
-
set runtimepath=${extra-runtimepath},$VIMRUNTIME
32
32
-
set shortmess+=I
33
33
-
set showcmd
34
34
-
set showmatch
35
35
-
set ttimeoutlen=0
36
36
-
set undodir=${dirs.undodir}
37
37
-
set undofile
38
38
-
set undolevels=1000000
39
39
-
set undoreload=1000000
40
40
-
set viminfo='20,<1000,s100,h,n${files.viminfo}
41
41
-
set visualbell
42
42
-
set wildignore+=*.o,*.class,*.hi,*.dyn_hi,*.dyn_o
43
43
-
set wildmenu
44
44
-
set wildmode=longest,full
45
45
-
46
46
-
" enable better-whitespace
47
47
-
let g:better_whitespace_enabled=1
48
48
-
49
49
-
set title
50
50
-
set titleold=
51
51
-
set titlestring=(vim)\ %t%(\ %M%)%(\ (%{expand(\"%:p:h\")})%)%(\ %a%)\ -\ %{v:servername}
52
52
-
53
53
-
set et ts=2 sts=2 sw=2
54
54
-
55
55
-
filetype plugin indent on
56
56
-
57
57
-
set t_Co=256
58
58
-
colorscheme dim
59
59
-
syntax on
60
60
-
61
61
-
au Syntax * syn match Garbage containedin=ALL /\s\+$/
62
62
-
\ | syn match TabStop containedin=ALL /\t\+/
63
63
-
\ | syn keyword Todo containedin=ALL TODO
64
64
-
\ | syn match NBSP '\%xa0'
65
65
-
\ | syn match NarrowNBSP '\%u202F'
66
66
-
67
67
-
au BufRead,BufNewFile *.hs so ${hs.vim}
68
68
-
69
69
-
au BufRead,BufNewFile *.nix so ${nix.vim}
70
70
-
71
71
-
au BufRead,BufNewFile /dev/shm/* set nobackup nowritebackup noswapfile
72
72
-
73
73
-
nnoremap <F5> :call LanguageClient_contextMenu()<CR>
74
74
-
set hidden
75
75
-
let g:LanguageClient_serverCommands = {
76
76
-
\ 'python': ['pyls'],
77
77
-
\ 'go': ['~/go/bin/go-langserver']
78
78
-
\ }
79
79
-
80
80
-
let g:LanguageClient_diagnosticsDisplay = {
81
81
-
\ 1: { "signText": "E" },
82
82
-
\ 2: { "signText": "W" }
83
83
-
\ }
84
84
-
85
85
-
nmap <esc>q :buffer
86
86
-
nmap <M-q> :buffer
87
87
-
88
88
-
cnoremap <C-A> <Home>
89
89
-
90
90
-
noremap <C-c> :q<cr>
91
91
-
vnoremap < <gv
92
92
-
vnoremap > >gv
93
93
-
94
94
-
nnoremap <esc>[5^ :tabp<cr>
95
95
-
nnoremap <esc>[6^ :tabn<cr>
96
96
-
nnoremap <esc>[5@ :tabm -1<cr>
97
97
-
nnoremap <esc>[6@ :tabm +1<cr>
98
98
-
99
99
-
nnoremap <f1> :tabp<cr>
100
100
-
nnoremap <f2> :tabn<cr>
101
101
-
inoremap <f1> <esc>:tabp<cr>
102
102
-
inoremap <f2> <esc>:tabn<cr>
103
103
-
104
104
-
" <C-{Up,Down,Right,Left>
105
105
-
noremap <esc>Oa <nop> | noremap! <esc>Oa <nop>
106
106
-
noremap <esc>Ob <nop> | noremap! <esc>Ob <nop>
107
107
-
noremap <esc>Oc <nop> | noremap! <esc>Oc <nop>
108
108
-
noremap <esc>Od <nop> | noremap! <esc>Od <nop>
109
109
-
" <[C]S-{Up,Down,Right,Left>
110
110
-
noremap <esc>[a <nop> | noremap! <esc>[a <nop>
111
111
-
noremap <esc>[b <nop> | noremap! <esc>[b <nop>
112
112
-
noremap <esc>[c <nop> | noremap! <esc>[c <nop>
113
113
-
noremap <esc>[d <nop> | noremap! <esc>[d <nop>
114
114
-
115
115
-
" search with ack
116
116
-
let g:ackprg = 'ag --vimgrep'
117
117
-
cnoreabbrev Ack Ack!
118
118
-
119
119
-
" copy/paste from/to xclipboard
120
120
-
set clipboard=unnamedplus
121
121
-
122
122
-
" use fzf to switch files
123
123
-
nnoremap <C-p> :FZF<CR>
124
124
-
nnoremap <C-l> :Rg<CR>
125
125
-
let g:fzf_layout = { 'down': '~15%' }
126
126
-
'';
127
127
-
128
128
-
extra-runtimepath = lib.concatMapStringsSep "," (pkg: "${pkg.outPath}") [
129
129
-
pkgs.vimPlugins.copilot-vim
130
130
-
pkgs.vimPlugins.undotree
131
131
-
pkgs.vimPlugins.fzf-vim
132
132
-
pkgs.vimPlugins.fzfWrapper
133
133
-
pkgs.vimPlugins.vim-better-whitespace
134
134
-
(pkgs.vimUtils.buildVimPlugin {
135
135
-
name = "file-line-1.0";
136
136
-
src = pkgs.fetchFromGitHub {
137
137
-
owner = "bogado";
138
138
-
repo = "file-line";
139
139
-
rev = "1.0";
140
140
-
sha256 = "0z47zq9rqh06ny0q8lpcdsraf3lyzn9xvb59nywnarf3nxrk6hx0";
141
141
-
};
142
142
-
})
143
143
-
(pkgs.vimUtils.buildVimPlugin {
144
144
-
name = "vim-dim-1.1.0";
145
145
-
src = pkgs.fetchFromGitHub {
146
146
-
owner = "jeffkreeftmeijer";
147
147
-
repo = "vim-dim";
148
148
-
rev = "1.1.0";
149
149
-
sha256 = "sha256-lyTZUgqUEEJRrzGo1FD8/t8KBioPrtB3MmGvPeEVI/g=";
150
150
-
};
151
151
-
})
152
152
-
((rtp: rtp // { inherit rtp; }) (pkgs.writeTextFile (let
153
153
-
name = "showsyntax";
154
154
-
in {
155
155
-
name = "vim-plugin-${name}-1.0.0";
156
156
-
destination = "/plugin/${name}.vim";
157
157
-
text = /* vim */ ''
158
158
-
if exists('g:loaded_showsyntax')
159
159
-
finish
160
160
-
endif
161
161
-
let g:loaded_showsyntax = 0
162
162
-
163
163
-
fu! ShowSyntax()
164
164
-
let id = synID(line("."), col("."), 1)
165
165
-
let name = synIDattr(id, "name")
166
166
-
let transName = synIDattr(synIDtrans(id),"name")
167
167
-
if name != transName
168
168
-
let name .= " (" . transName . ")"
169
169
-
endif
170
170
-
echo "Syntax: " . name
171
171
-
endfu
172
172
-
173
173
-
command! -n=0 -bar ShowSyntax :call ShowSyntax()
174
174
-
'';
175
175
-
})))
176
176
-
];
177
177
-
178
178
-
dirs = {
179
179
-
backupdir = "$HOME/.cache/vim/backup";
180
180
-
swapdir = "$HOME/.cache/vim/swap";
181
181
-
undodir = "$HOME/.cache/vim/undo";
182
182
-
};
183
183
-
files = {
184
184
-
viminfo = "$HOME/.cache/vim/info";
185
185
-
};
186
186
-
187
187
-
mkdirs = let
188
188
-
dirOf = s: let out = lib.concatStringsSep "/" (lib.init (lib.splitString "/" s));
189
189
-
in assert out != ""; out;
190
190
-
alldirs = lib.attrValues dirs ++ map dirOf (lib.attrValues files);
191
191
-
in lib.unique (lib.sort lib.lessThan alldirs);
192
192
-
193
193
-
vim = pkgs.symlinkJoin {
194
194
-
name = "vim";
195
195
-
paths = [
196
196
-
(pkgs.writers.writeDashBin "vim" ''
197
197
-
set -efu
198
198
-
export PATH=$PATH:${lib.makeBinPath [
199
199
-
pkgs.nodejs
200
200
-
]}
201
201
-
(umask 0077; exec ${pkgs.coreutils}/bin/mkdir -p ${toString mkdirs})
202
202
-
exec ${pkgs.vim}/bin/vim "$@"
203
203
-
'')
204
204
-
pkgs.vim
205
205
-
];
206
206
-
};
207
207
-
208
208
-
hs.vim = pkgs.writeText "hs.vim" ''
209
209
-
syn region String start=+\[[[:alnum:]]*|+ end=+|]+
210
210
-
211
211
-
hi link ConId Identifier
212
212
-
hi link VarId Identifier
213
213
-
hi link hsDelimiter Delimiter
214
214
-
'';
215
215
-
216
216
-
nix.vim = pkgs.writeText "nix.vim" ''
217
217
-
setf nix
218
218
-
219
219
-
" Ref <nix/src/libexpr/lexer.l>
220
220
-
syn match NixID /[a-zA-Z\_][a-zA-Z0-9\_\'\-]*/
221
221
-
syn match NixINT /\<[0-9]\+\>/
222
222
-
syn match NixPATH /[a-zA-Z0-9\.\_\-\+]*\(\/[a-zA-Z0-9\.\_\-\+]\+\)\+/
223
223
-
syn match NixHPATH /\~\(\/[a-zA-Z0-9\.\_\-\+]\+\)\+/
224
224
-
syn match NixSPATH /<[a-zA-Z0-9\.\_\-\+]\+\(\/[a-zA-Z0-9\.\_\-\+]\+\)*>/
225
225
-
syn match NixURI /[a-zA-Z][a-zA-Z0-9\+\-\.]*:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']\+/
226
226
-
syn region NixSTRING
227
227
-
\ matchgroup=NixSTRING
228
228
-
\ start='"'
229
229
-
\ skip='\\"'
230
230
-
\ end='"'
231
231
-
syn region NixIND_STRING
232
232
-
\ matchgroup=NixIND_STRING
233
233
-
\ start="'''"
234
234
-
\ skip="'''\('\|[$]\|\\[nrt]\)"
235
235
-
\ end="'''"
236
236
-
237
237
-
syn match NixOther /[():/;=.,?\[\]]/
238
238
-
239
239
-
syn match NixCommentMatch /\(^\|\s\)#.*/
240
240
-
syn region NixCommentRegion start="/\*" end="\*/"
241
241
-
242
242
-
hi link NixCode Statement
243
243
-
hi link NixData Constant
244
244
-
hi link NixComment Comment
245
245
-
246
246
-
hi link NixCommentMatch NixComment
247
247
-
hi link NixCommentRegion NixComment
248
248
-
hi link NixID NixCode
249
249
-
hi link NixINT NixData
250
250
-
hi link NixPATH NixData
251
251
-
hi link NixHPATH NixData
252
252
-
hi link NixSPATH NixData
253
253
-
hi link NixURI NixData
254
254
-
hi link NixSTRING NixData
255
255
-
hi link NixIND_STRING NixData
256
256
-
257
257
-
hi link NixEnter NixCode
258
258
-
hi link NixOther NixCode
259
259
-
hi link NixQuote NixData
260
260
-
261
261
-
syn cluster nix_has_dollar_curly contains=@nix_ind_strings,@nix_strings
262
262
-
syn cluster nix_ind_strings contains=NixIND_STRING
263
263
-
syn cluster nix_strings contains=NixSTRING
264
264
-
265
265
-
${lib.concatStringsSep "\n" (lib.mapAttrsToList (lang: { extraStart ? null }: let
266
266
-
startAlts = lib.filter lib.isString [
267
267
-
''/\* ${lang} \*/''
268
268
-
extraStart
269
269
-
];
270
270
-
sigil = ''\(${lib.concatStringsSep ''\|'' startAlts}\)[ \t\r\n]*'';
271
271
-
in /* vim */ ''
272
272
-
syn include @nix_${lang}_syntax syntax/${lang}.vim
273
273
-
unlet b:current_syntax
274
274
-
275
275
-
syn match nix_${lang}_sigil
276
276
-
\ X${lib.replaceStrings ["X"] ["\\X"] sigil}\ze\('''\|"\)X
277
277
-
\ nextgroup=nix_${lang}_region_IND_STRING,nix_${lang}_region_STRING
278
278
-
\ transparent
279
279
-
280
280
-
syn region nix_${lang}_region_STRING
281
281
-
\ matchgroup=NixSTRING
282
282
-
\ start='"'
283
283
-
\ skip='\\"'
284
284
-
\ end='"'
285
285
-
\ contained
286
286
-
\ contains=@nix_${lang}_syntax
287
287
-
\ transparent
288
288
-
289
289
-
syn region nix_${lang}_region_IND_STRING
290
290
-
\ matchgroup=NixIND_STRING
291
291
-
\ start="'''"
292
292
-
\ skip="'''\('\|[$]\|\\[nrt]\)"
293
293
-
\ end="'''"
294
294
-
\ contained
295
295
-
\ contains=@nix_${lang}_syntax
296
296
-
\ transparent
297
297
-
298
298
-
syn cluster nix_ind_strings
299
299
-
\ add=nix_${lang}_region_IND_STRING
300
300
-
301
301
-
syn cluster nix_strings
302
302
-
\ add=nix_${lang}_region_STRING
303
303
-
304
304
-
syn cluster nix_has_dollar_curly
305
305
-
\ add=@nix_${lang}_syntax
306
306
-
'') {
307
307
-
c = {};
308
308
-
cabal = {};
309
309
-
haskell = {};
310
310
-
sh.extraStart = ''write\(Ba\|Da\)sh[^ \t\r\n]*[ \t\r\n]*"[^"]*"'';
311
311
-
vim.extraStart =
312
312
-
''write[^ \t\r\n]*[ \t\r\n]*"\(\([^"]*\.\)\?vimrc\|[^"]*\.vim\)"'';
313
313
-
})}
314
314
-
315
315
-
" Clear syntax that interferes with nixINSIDE_DOLLAR_CURLY.
316
316
-
syn clear shVarAssign
317
317
-
318
318
-
syn region nixINSIDE_DOLLAR_CURLY
319
319
-
\ matchgroup=NixEnter
320
320
-
\ start="[$]{"
321
321
-
\ end="}"
322
322
-
\ contains=TOP
323
323
-
\ containedin=@nix_has_dollar_curly
324
324
-
\ transparent
325
325
-
326
326
-
syn region nix_inside_curly
327
327
-
\ matchgroup=NixEnter
328
328
-
\ start="{"
329
329
-
\ end="}"
330
330
-
\ contains=TOP
331
331
-
\ containedin=nixINSIDE_DOLLAR_CURLY,nix_inside_curly
332
332
-
\ transparent
333
333
-
334
334
-
syn match NixQuote /'''\([''$']\|\\.\)/he=s+2
335
335
-
\ containedin=@nix_ind_strings
336
336
-
\ contained
337
337
-
338
338
-
syn match NixQuote /\\./he=s+1
339
339
-
\ containedin=@nix_strings
340
340
-
\ contained
341
341
-
342
342
-
syn sync fromstart
343
343
-
344
344
-
let b:current_syntax = "nix"
345
345
-
346
346
-
set isk=@,48-57,_,192-255,-,'
347
347
-
'';
348
348
-
in
349
349
-
out