Skip to content

Commit 048c71f

Browse files
authored
Merge pull request #56 from Ma27/path-interpolation
syntax: correctly highlight paths with interpolation
2 parents 1e8d3cc + 240ce59 commit 048c71f

File tree

3 files changed

+179
-1
lines changed

3 files changed

+179
-1
lines changed

default.nix

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ stdenv.mkDerivation rec {
3939
endfunction
4040
4141
command! Syntax call Syntax()
42+
43+
set backspace=2
44+
set hlsearch
4245
'';
4346

4447
checkPhase = ''

syntax/nix.vim

+3-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ syn region nixString matchgroup=nixStringDelimiter start=+''+ skip=+''['$\\]+ en
5050
syn match nixFunctionCall "[a-zA-Z_][a-zA-Z0-9_'-]*"
5151

5252
syn match nixPath "[a-zA-Z0-9._+-]*\%(/[a-zA-Z0-9._+-]\+\)\+"
53+
syn region nixInterpolatedPath start="\%(\~\|[a-zA-Z0-9._+-]*\)/[a-zA-Z0-9._+/-]*\ze${" skip="[a-zA-Z0-9._+/-]*\ze${" end="}\@<=[a-zA-Z0-9._+/-]*\%([^a-zA-Z0-9._+/-]\|$\)\@=" contains=nixInterpolation
5354
syn match nixHomePath "\~\%(/[a-zA-Z0-9._+-]\+\)\+"
5455
syn match nixSearchPath "[a-zA-Z0-9._+-]\+\%(\/[a-zA-Z0-9._+-]\+\)*" contained
5556
syn match nixPathDelimiter "[<>]" contained
@@ -123,7 +124,7 @@ syn region nixWithExpr matchgroup=nixWithExprKeyword start="\<with\>" matchgroup
123124

124125
syn region nixAssertExpr matchgroup=nixAssertKeyword start="\<assert\>" matchgroup=NONE end=";" contains=@nixExpr
125126

126-
syn cluster nixExpr contains=nixBoolean,nixNull,nixOperator,nixParen,nixInteger,nixRecKeyword,nixConditional,nixBuiltin,nixSimpleBuiltin,nixComment,nixFunctionCall,nixFunctionArgument,nixArgOperator,nixSimpleFunctionArgument,nixPath,nixHomePath,nixSearchPathRef,nixURI,nixAttributeSet,nixList,nixSimpleString,nixString,nixLetExpr,nixIfExpr,nixWithExpr,nixAssertExpr,nixInterpolation
127+
syn cluster nixExpr contains=nixBoolean,nixNull,nixOperator,nixParen,nixInteger,nixRecKeyword,nixConditional,nixBuiltin,nixSimpleBuiltin,nixComment,nixFunctionCall,nixFunctionArgument,nixArgOperator,nixSimpleFunctionArgument,nixInterpolatedPath,nixPath,nixHomePath,nixSearchPathRef,nixURI,nixAttributeSet,nixList,nixSimpleString,nixString,nixLetExpr,nixIfExpr,nixWithExpr,nixAssertExpr,nixInterpolation
127128

128129
" These definitions override @nixExpr and have to come afterwards:
129130

@@ -179,6 +180,7 @@ hi def link nixNamespacedBuiltin Special
179180
hi def link nixNull Constant
180181
hi def link nixOperator Operator
181182
hi def link nixPath Include
183+
hi def link nixInterpolatedPath nixPath
182184
hi def link nixPathDelimiter Delimiter
183185
hi def link nixRecKeyword Keyword
184186
hi def link nixSearchPath Include

test/nix.vader

+173
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,179 @@ Execute (syntax):
234234
AssertEqual SyntaxOf('\./\.'), 'nixPath'
235235
AssertEqual SyntaxOf('/etc/passwd'), 'nixPath'
236236

237+
Given nix (path-with-interpolation-simple):
238+
./snens/${bar}/baz
239+
240+
Execute (syntax):
241+
AssertEqual SyntaxOf('./'), 'nixInterpolatedPath'
242+
AssertEqual SyntaxOf('${'), 'nixInterpolationDelimiter'
243+
AssertEqual SyntaxOf('/baz'), 'nixInterpolatedPath'
244+
AssertEqual SyntaxAt(1, 8), 'nixInterpolatedPath'
245+
AssertEqual SyntaxAt(1, 15), 'nixInterpolatedPath'
246+
247+
Given nix (path-with-interpolation-in-path-part):
248+
./snens/${bar}kek/end
249+
250+
Execute (syntax):
251+
AssertEqual SyntaxOf('./'), 'nixInterpolatedPath'
252+
AssertEqual SyntaxOf('${'), 'nixInterpolationDelimiter'
253+
AssertEqual SyntaxOf('/end'), 'nixInterpolatedPath'
254+
AssertEqual SyntaxAt(1, 8), 'nixInterpolatedPath'
255+
AssertEqual SyntaxAt(1, 14), 'nixInterpolationDelimiter'
256+
AssertEqual SyntaxAt(1, 15), 'nixInterpolatedPath'
257+
258+
Given nix (path-with-interpolation-and-prefix):
259+
./snens/pre${bar}
260+
261+
Execute (syntax):
262+
AssertEqual SyntaxOf('./'), 'nixInterpolatedPath'
263+
AssertEqual SyntaxOf('${'), 'nixInterpolationDelimiter'
264+
AssertEqual SyntaxAt(1, 8), 'nixInterpolatedPath'
265+
AssertEqual SyntaxAt(1, 12), 'nixInterpolationDelimiter'
266+
AssertEqual SyntaxAt(1, 17), 'nixInterpolationDelimiter'
267+
268+
Given nix (path-with-interpolation-suffix):
269+
./snens/pre${bar}suff
270+
271+
Execute (syntax):
272+
AssertEqual SyntaxOf('./'), 'nixInterpolatedPath'
273+
AssertEqual SyntaxOf('${'), 'nixInterpolationDelimiter'
274+
AssertEqual SyntaxAt(1, 8), 'nixInterpolatedPath'
275+
AssertEqual SyntaxAt(1, 12), 'nixInterpolationDelimiter'
276+
AssertEqual SyntaxAt(1, 17), 'nixInterpolationDelimiter'
277+
AssertEqual SyntaxOf('suff'), 'nixInterpolatedPath'
278+
279+
Given nix (path-with-interpolation-in-mid-part):
280+
./snens/pre${bar}/kek
281+
282+
Execute (syntax):
283+
AssertEqual SyntaxOf('./'), 'nixInterpolatedPath'
284+
AssertEqual SyntaxOf('${'), 'nixInterpolationDelimiter'
285+
AssertEqual SyntaxOf('/kek'), 'nixInterpolatedPath'
286+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
287+
288+
Given nix (path-with-multiple-interpolations):
289+
./snens/${bar}${baz}
290+
291+
Execute (syntax):
292+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
293+
AssertEqual SyntaxAt(1, 9), 'nixInterpolationDelimiter'
294+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
295+
AssertEqual SyntaxOf('baz'), 'nixInterpolationParam'
296+
AssertEqual SyntaxAt(1, 20), 'nixInterpolationDelimiter'
297+
298+
Given nix (path-with-multiple-interpolations-and-infix):
299+
./snens/${bar}in${baz}
300+
301+
Execute (syntax):
302+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
303+
AssertEqual SyntaxAt(1, 9), 'nixInterpolationDelimiter'
304+
AssertEqual SyntaxOf('in'), 'nixInterpolatedPath'
305+
AssertEqual SyntaxAt(1, 17), 'nixInterpolationDelimiter'
306+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
307+
AssertEqual SyntaxOf('baz'), 'nixInterpolationParam'
308+
AssertEqual SyntaxAt(1, 22), 'nixInterpolationDelimiter'
309+
AssertEqual SyntaxAt(1, 14), 'nixInterpolationDelimiter'
310+
311+
Given nix (path-with-multiple-interpolations-and-suffix):
312+
./snens/${bar}in${baz}suff
313+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
314+
AssertEqual SyntaxAt(1, 9), 'nixInterpolationDelimiter'
315+
AssertEqual SyntaxOf('in'), 'nixInterpolatedPath'
316+
AssertEqual SyntaxAt(1, 17), 'nixInterpolationDelimiter'
317+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
318+
AssertEqual SyntaxOf('baz'), 'nixInterpolationParam'
319+
AssertEqual SyntaxAt(1, 22), 'nixInterpolationDelimiter'
320+
AssertEqual SyntaxAt(1, 14), 'nixInterpolationDelimiter'
321+
AssertEqual SyntaxOf('suff'), 'nixInterpolatedPath'
322+
323+
Execute (syntax):
324+
325+
Given nix (path-with-multiple-interpolations-and-prefix):
326+
./snens/pre${bar}in${baz}
327+
328+
Execute (syntax):
329+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
330+
AssertEqual SyntaxAt(1, 12), 'nixInterpolationDelimiter'
331+
AssertEqual SyntaxOf('in'), 'nixInterpolatedPath'
332+
AssertEqual SyntaxAt(1, 20), 'nixInterpolationDelimiter'
333+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
334+
AssertEqual SyntaxOf('baz'), 'nixInterpolationParam'
335+
AssertEqual SyntaxAt(1, 25), 'nixInterpolationDelimiter'
336+
AssertEqual SyntaxAt(1, 17), 'nixInterpolationDelimiter'
337+
338+
Given nix (path-with-multiple-interpolations-and-dir-suffix):
339+
./snens/${bar}in${baz}/suff
340+
341+
Execute (syntax):
342+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
343+
AssertEqual SyntaxAt(1, 9), 'nixInterpolationDelimiter'
344+
AssertEqual SyntaxOf('in'), 'nixInterpolatedPath'
345+
AssertEqual SyntaxAt(1, 17), 'nixInterpolationDelimiter'
346+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
347+
AssertEqual SyntaxOf('baz'), 'nixInterpolationParam'
348+
AssertEqual SyntaxAt(1, 22), 'nixInterpolationDelimiter'
349+
AssertEqual SyntaxAt(1, 14), 'nixInterpolationDelimiter'
350+
AssertEqual SyntaxAt(1, 23), 'nixInterpolatedPath'
351+
352+
Given nix (path-with-multiple-interpolations-in-separate-dirs):
353+
./snens/${bar}/${baz}
354+
355+
Execute (syntax):
356+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
357+
AssertEqual SyntaxAt(1, 9), 'nixInterpolationDelimiter'
358+
AssertEqual SyntaxAt(1, 16), 'nixInterpolationDelimiter'
359+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
360+
AssertEqual SyntaxOf('baz'), 'nixInterpolationParam'
361+
AssertEqual SyntaxAt(1, 21), 'nixInterpolationDelimiter'
362+
AssertEqual SyntaxAt(1, 14), 'nixInterpolationDelimiter'
363+
AssertEqual SyntaxAt(1, 15), 'nixInterpolatedPath'
364+
365+
Given nix (homepath-with-interpolation):
366+
~/${snens}
367+
368+
Execute (syntax):
369+
AssertEqual SyntaxOf('\~/'), 'nixInterpolatedPath'
370+
AssertEqual SyntaxOf('${'), 'nixInterpolationDelimiter'
371+
AssertEqual SyntaxOf('snens'), 'nixInterpolationParam'
372+
373+
Given nix (path-with-invalid-infix):
374+
./snens/${bar}in!${baz}
375+
376+
Execute (syntax):
377+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
378+
AssertEqual SyntaxAt(1, 8), 'nixInterpolatedPath'
379+
AssertEqual SyntaxAt(1, 9), 'nixInterpolationDelimiter'
380+
AssertEqual SyntaxOf('bar'), 'nixInterpolationParam'
381+
AssertEqual SyntaxOf('in'), 'nixInterpolatedPath'
382+
# invalid syntax. Just make sure this isn't misinterpreted as a path.
383+
AssertEqual SyntaxOf('!'), 'nixOperator'
384+
AssertEqual SyntaxAt(1, 18), ''
385+
AssertEqual SyntaxOf('baz'), 'nixArgumentDefinition'
386+
387+
Given nix (path-with-recursive-interpolation):
388+
./snens/${bar.${baz}}/suff
389+
390+
Execute (syntax):
391+
AssertEqual SyntaxOf('./snens'), 'nixInterpolatedPath'
392+
AssertEqual SyntaxAt(1, 9), 'nixInterpolationDelimiter'
393+
AssertEqual SyntaxAt(1, 15), 'nixInterpolationDelimiter'
394+
AssertEqual SyntaxAt(1, 21), 'nixInterpolationDelimiter'
395+
AssertEqual SyntaxAt(1, 11), 'nixInterpolationParam'
396+
AssertEqual SyntaxAt(1, 22), 'nixInterpolatedPath'
397+
398+
Given nix (path-with-multiline-subexpr):
399+
foo/${
400+
"bar"
401+
}
402+
403+
Execute (syntax):
404+
AssertEqual SyntaxOf('foo/'), 'nixInterpolatedPath'
405+
AssertEqual SyntaxOf('${'), 'nixInterpolationDelimiter'
406+
AssertEqual SyntaxOf('"'), 'nixStringDelimiter'
407+
AssertEqual SyntaxOf('bar'), 'nixSimpleString'
408+
AssertEqual SyntaxOf('}'), 'nixInterpolationDelimiter'
409+
237410
Given nix (let):
238411
let
239412
foo = true;

0 commit comments

Comments
 (0)