0
0
mirror of https://github.com/vim/vim.git synced 2025-10-15 07:14:09 -04:00

runtime(cangjie): Fixes and improvements for syntax script

Housekeeping:
- Add GitHub repository link
- Update Last Change date

Style:
- Add Vim modeline for consistent formatting
- Unify indentation style (spaces to tabs)
- Wrap long cluster definitions for readability

New Features:
- Add highlighting for escape sequences
- Add error highlighting for invalid rune literals
- Add syntax-based folding support

Fixes:
- Fix rune matching to allow only a single character/escape
- Fix highlighting for double-quoted rune literals
- Fix highlighting for floats with exponents and type suffixes

Co-authored-by: dkearns <dougkearns@gmail.com>
Signed-off-by: Wu Junkai <wujunkai20041123@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Wu Junkai
2025-10-12 14:10:34 +00:00
committed by Christian Brabandt
parent 6800da6ff1
commit 37c8ce7fac

View File

@@ -1,7 +1,8 @@
" Vim syntax file
" Language: Cangjie
" Maintainer: Wu Junkai <wu.junkai@qq.com>
" Last Change: 2025 Aug 17
" URL: https://github.com/WuJunkai2004/cangjie.vim
" Last Change: 2025 Oct 12
"
" The Cangjie programming language is a new-generation programming
" language oriented to full-scenario intelligence. It features
@@ -47,7 +48,12 @@ syn keyword cangjieIdentlike false init main this true
syn keyword cangjieVariable const let var
syn keyword cangjieOption Option Some None
syn keyword cangjieDeclaration func struct class enum import package nextgroup=cangjieTypeName skipwhite
syn cluster cangjieKeywordCluster contains=cangjieDeclaration,cangjieStatement,cangjieIdentlike,cangjieVariable,cangjieOption
syn cluster cangjieKeywordCluster contains=
\ cangjieDeclaration,
\ cangjieStatement,
\ cangjieIdentlike,
\ cangjieVariable,
\ cangjieOption
" 3. macro (e.g., @override)
syn match cangjieMacro /@\h\w*/
@@ -66,30 +72,54 @@ syn keyword cangjieCommonType Bool Byte Rune String
syn keyword cangjieFloatType Float16 Float32 Float64
syn keyword cangjieIntType Int8 Int16 Int32 Int64 IntNative
syn keyword cangjieUIntType UInt8 UInt16 UInt32 UInt64 UIntNative
syn cluster cangjieTypeCluster contains=cangjieSpType,cangjieArrayType,cangjieHashType,cangjieCommonType,cangjieFloatType,cangjieIntType,cangjieUIntType
syn cluster cangjieTypeCluster contains=
\ cangjieSpType,
\ cangjieArrayType,
\ cangjieHashType,
\ cangjieCommonType,
\ cangjieFloatType,
\ cangjieIntType,
\ cangjieUIntType
" 7. character and strings
syn cluster cangjieInterpolatedPart contains=@cangjieKeywordCluster,cangjieSpIdentifier,@cangjieTypeCluster,@cangjieNumberCluster,cangjieOperator
syn region cangjieInterpolation contained keepend start=/\${/ end=/}/ contains=@cangjieInterpolatedPart matchgroup=cangjieInterpolationDelimiter
syn region cangjieRune start=/r'/ skip=/\\\\\|\\'/ end=/'/ oneline
syn region cangjieRune start=/b'/ skip=/\\\\\|\\'/ end=/'/ oneline
syn region cangjieString start=/"/ skip=/\\\\\|\\"/ end=/"/ oneline contains=cangjieInterpolation
syn region cangjieString start=/'/ skip=/\\\\\|\\'/ end=/'/ oneline contains=cangjieInterpolation
syn region cangjieString start=/"""/ skip=/\\\\\|\\"/ end=/"""/ contains=cangjieInterpolation keepend
syn region cangjieString start=/'''/ skip=/\\\\\|\\'/ end=/'''/ contains=cangjieInterpolation keepend
syn cluster cangjieInterpolatedPart contains=
\ @cangjieKeywordCluster,
\ cangjieSpIdentifier,
\ @cangjieTypeCluster,
\ @cangjieNumberCluster,
\ cangjieOperator
syn region cangjieInterpolation contained keepend start=/\${/ end=/}/ contains=@cangjieInterpolatedPart
syn match cangjieEscape /\v\\u\{[0-9a-fA-F]{1,8}\}|\\./ contained
syn match cangjieRuneError /\v[rb]'([^'\\]|\\.)*'/
syn match cangjieRuneError /\v[rb]"([^"\\]|\\.)*"/
syn match cangjieRune /\vr'(\\u\{[0-9a-fA-F]{1,8}\}|\\.|[^'\\])'/ contains=cangjieEscape
syn match cangjieRune /\vr"(\\u\{[0-9a-fA-F]{1,8}\}|\\.|[^"\\])"/ contains=cangjieEscape
syn match cangjieRune /\vb'(\\u\{[0-9a-fA-F]{1,8}\}|\\.|[^'\\])'/ contains=cangjieEscape
syn region cangjieString start=/"/ skip=/\\\\\|\\"/ end=/"/ oneline contains=cangjieInterpolation,cangjieEscape
syn region cangjieString start=/'/ skip=/\\\\\|\\'/ end=/'/ oneline contains=cangjieInterpolation,cangjieEscape
syn region cangjieString start=/"""/ skip=/\\\\\|\\"/ end=/"""/ contains=cangjieInterpolation,cangjieEscape keepend
syn region cangjieString start=/'''/ skip=/\\\\\|\\'/ end=/'''/ contains=cangjieInterpolation,cangjieEscape keepend
syn region cangjieRawString start='\z(#*\)#"' end='"#\z1'
syn region cangjieRawString start='\z(#*\)#\'' end='\'#\z1'
" 8. number
syn match cangjieHexFloatNumber /\v\c<0x([0-9a-f_]+\.?|[0-9a-f_]*\.[0-9a-f_]+)[p][-+]?\d[0-9_]*>/
syn match cangjieFloatNumber /\v\c<\d[0-9_]*\.\d[0-9_]*([ep][-+]?\d[0-9_]*)?(f(16|32|64))?>/
syn match cangjieFloatNumber /\v\c<\d[0-9_]*\.([ep][-+]?\d[0-9_]*)?(f(16|32|64))?>/
syn match cangjieFloatNumber /\v\c\.\d[0-9_]*([ep][-+]?\d[0-9_]*)?(f(16|32|64))?>/
syn match cangjieScienceNumber /\v\c<\d[0-9_]*[e][-+]?\d[0-9_]*>/
syn match cangjieScienceNumber /\v\c<\d[0-9_]*[e][-+]?\d[0-9_]*(f(16|32|64))?>/
syn match cangjieHexNumber /\v\c<0x[0-9a-f_]+([iu](8|16|32|64))?>/
syn match cangjieOctalNumber /\v\c<0o[0-7_]+([iu](8|16|32|64))?>/
syn match cangjieBinaryNumber /\v\c<0b[01_]+([iu](8|16|32|64))?>/
syn match cangjieDecimalNumber /\v\c<\d[0-9_]*([iu](8|16|32|64))?>/
syn cluster cangjieNumberCluster contains=cangjieFloatNumber,cangjieScienceNumber,cangjieHexNumber,cangjieOctalNumber,cangjieBinaryNumber,cangjieDecimalNumber
syn cluster cangjieNumberCluster contains=
\ cangjieHexFloatNumber,
\ cangjieFloatNumber,
\ cangjieScienceNumber,
\ cangjieHexNumber,
\ cangjieOctalNumber,
\ cangjieBinaryNumber,
\ cangjieDecimalNumber
" 9. operators
syn match cangjieOperator /[-+%<>!&|^*=]=\?/
@@ -101,6 +131,11 @@ syn match cangjieOperator /[:]/
syn match cangjieOperator /\.\./
syn match cangjieVarArgs /\.\.\./
" 10. folding
syn region cangjieFoldBraces transparent fold start='{' end='}' contains=ALLBUT,cangjieComment
syn region cangjieFoldParens transparent fold start='(' end=')' contains=ALLBUT,cangjieComment
syn region cangjieFoldBrackets transparent fold start='\[' end='\]' contains=ALLBUT,cangjieComment
" finally, link the syntax groups to the highlight groups
if s:enabled('comment')
hi def link cangjieTodo Todo
@@ -120,6 +155,7 @@ if s:enabled('macro')
hi def link cangjieMacro PreProc
endif
if s:enabled('number')
hi def link cangjieHexFloatNumber Number
hi def link cangjieFloatNumber Float
hi def link cangjieScienceNumber Float
hi def link cangjieHexNumber Number
@@ -133,8 +169,10 @@ if s:enabled('operator')
endif
if s:enabled('string')
hi def link cangjieRune Character
hi def link cangjieRuneError Error
hi def link cangjieString String
hi def link cangjieRawString String
hi def link cangjieEscape SpecialChar
endif
if s:enabled('type')
hi def link cangjieTypeName Type
@@ -151,3 +189,5 @@ let b:current_syntax = "cangjie"
let &cpo = s:save_cpo
unlet s:save_cpo
" vim: ts=8 sw=8 noet