vim/runtime/syntax/spajson.vim
David Mandelberg 4e7b4308fb
patch 9.1.1231: filetype: SPA JSON files are not recognized
Problem:  filetype: SPA (single page application) JSON files are not
          recognized (used by pipewire and wireplumber)
Solution: detect pipewire and wireplumber configuration files as spajson
          filetype, include filetype, indent and syntax scripts for this
          new filetype (David Mandelberg).

I looked at all the files found by this command to see if the syntax
highlighting looked reasonable:

```
find {~/.config,/etc,/usr/share}/{pipewire,wireplumber} -type f -name \*.conf
```

References:
*   pipewire config files: https://docs.pipewire.org/page_config.html
*   wireplumber config files:
    https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/conf_file.html
    and
*   https://pipewire.pages.freedesktop.org/wireplumber/daemon/locations.html

closes: #16950

Signed-off-by: David Mandelberg <david@mandelberg.org>
Signed-off-by: Christian Brabandt <cb@256bit.org>
2025-03-23 10:26:00 +01:00

50 lines
1.8 KiB
VimL

" Vim syntax file
" Language: SPA JSON
" Maintainer: David Mandelberg <david@mandelberg.org>
" Last Change: 2025 Mar 22
"
" Based on parser code:
" https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/spa/include/spa/utils/json-core.h
if exists("b:current_syntax")
finish
endif
let b:current_syntax = "spajson"
syn sync minlines=500
" Treat the __BARE parser state as a keyword, to make it easier to match
" keywords and numbers only when they're not part of a larger __BARE section.
" E.g., v4l2 and pipewire-0 probably shouldn't highlight anything as
" spajsonInt.
syn iskeyword 32-126,^ ,^",^#,^:,^,,^=,^],^},^\
syn match spajsonEscape "\\["\\/bfnrt]" contained
syn match spajsonEscape "\\u[0-9A-Fa-f]\{4}" contained
syn match spajsonError "."
syn match spajsonBare "\k\+"
syn match spajsonComment "#.*$" contains=@Spell
syn region spajsonString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=spajsonEscape
syn match spajsonKeyDelimiter "[:=]"
syn region spajsonArray matchgroup=spajsonBracket start="\[" end="]" contains=ALLBUT,spajsonKeyDelimiter fold
syn region spajsonObject matchgroup=spajsonBrace start="{" end="}" contains=ALL fold
syn match spajsonFloat "\<[+-]\?[0-9]\+\(\.[0-9]*\)\?\([Ee][+-]\?[0-9]\+\)\?\>"
syn match spajsonFloat "\<[+-]\?\.[0-9]\+\([Ee][+-]\?[0-9]\+\)\?\>"
syn match spajsonInt "\<[+-]\?0[Xx][0-9A-Fa-f]\+\>"
syn match spajsonInt "\<[+-]\?[1-9][0-9]*\>"
syn match spajsonInt "\<[+-]\?0[0-7]*\>"
syn keyword spajsonBoolean true false
syn keyword spajsonNull null
syn match spajsonWhitespace "[\x00\t \r\n,]"
hi def link spajsonBoolean Boolean
hi def link spajsonBrace Delimiter
hi def link spajsonBracket Delimiter
hi def link spajsonComment Comment
hi def link spajsonError Error
hi def link spajsonEscape SpecialChar
hi def link spajsonFloat Float
hi def link spajsonInt Number
hi def link spajsonNull Constant
hi def link spajsonString String