diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS index 26cc51af09..236e3567cc 100644 --- a/.github/MAINTAINERS +++ b/.github/MAINTAINERS @@ -449,6 +449,7 @@ runtime/syntax/bzr.vim @hdima runtime/syntax/cabal.vim @coot runtime/syntax/cabalconfig.vim @coot runtime/syntax/cabalproject.vim @coot +runtime/syntax/cangjie.vim @WuJunkai2004 runtime/syntax/cf.vim @ernstvanderlinden runtime/syntax/chatito.vim @ObserverOfTime runtime/syntax/chicken.vim @evhan diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 9fe4be552a..2aecb65a6b 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 9.1. Last change: 2025 Aug 10 +*syntax.txt* For Vim version 9.1. Last change: 2025 Aug 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1116,6 +1116,23 @@ in the "after" directory in 'runtimepath'. For Unix this would be syn sync fromstart set foldmethod=syntax +CANGJIE *cangjie.vim* *ft-cangjie-syntax* + +This file provides syntax highlighting for the Cangjie programming language, a +new-generation language oriented to full-scenario intelligence. + +All highlighting is enabled by default. To disable highlighting for a +specific group, set the corresponding variable to 0 in your |vimrc|. +All options to disable highlighting are: > + :let g:cangjie_comment_color = 0 + :let g:cangjie_identifier_color = 0 + :let g:cangjie_keyword_color = 0 + :let g:cangjie_macro_color = 0 + :let g:cangjie_number_color = 0 + :let g:cangjie_operator_color = 0 + :let g:cangjie_string_color = 0 + :let g:cangjie_type_color = 0 + CH *ch.vim* *ft-ch-syntax* C/C++ interpreter. Ch has similar syntax highlighting to C and builds upon diff --git a/runtime/doc/tags b/runtime/doc/tags index 9a0f8f2cf2..63c1506f15 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -6486,6 +6486,7 @@ c_space_errors syntax.txt /*c_space_errors* c_syntax_for_h syntax.txt /*c_syntax_for_h* c_wildchar cmdline.txt /*c_wildchar* call() builtin.txt /*call()* +cangjie.vim syntax.txt /*cangjie.vim* carriage-return intro.txt /*carriage-return* case change.txt /*case* catch-all eval.txt /*catch-all* @@ -7424,6 +7425,7 @@ ft-bash-syntax syntax.txt /*ft-bash-syntax* ft-basic-syntax syntax.txt /*ft-basic-syntax* ft-c-omni insert.txt /*ft-c-omni* ft-c-syntax syntax.txt /*ft-c-syntax* +ft-cangjie-syntax syntax.txt /*ft-cangjie-syntax* ft-ch-syntax syntax.txt /*ft-ch-syntax* ft-changelog-plugin filetype.txt /*ft-changelog-plugin* ft-changelog-syntax syntax.txt /*ft-changelog-syntax* diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 0222415785..1b0e4183f9 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -2433,6 +2433,9 @@ au BufNewFile,BufRead *.il,*.ils,*.cdf setf skill " Cadence au BufNewFile,BufRead *.cdc setf cdc +" Cangjie +au BufNewFile,BufRead *.cj setf cangjie + " SLRN au BufNewFile,BufRead .slrnrc setf slrnrc au BufNewFile,BufRead *.score setf slrnsc diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim index 8ef1788894..3cff23db2a 100644 --- a/runtime/makemenu.vim +++ b/runtime/makemenu.vim @@ -124,6 +124,7 @@ SynMenu C.C++:cpp SynMenu C.C#:cs SynMenu C.Cabal\ Haskell\ build\ file:cabal SynMenu C.Calendar:calendar +SynMenu C.Cangjie:cangjie SynMenu C.Cascading\ Style\ Sheets:css SynMenu C.CDL:cdl SynMenu C.Cdrdao\ TOC:cdrtoc diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim index 164b04f9ae..5d3321585e 100644 --- a/runtime/synmenu.vim +++ b/runtime/synmenu.vim @@ -110,6 +110,7 @@ an 50.20.110 &Syntax.C.C++ :cal SetSyn("cpp") an 50.20.120 &Syntax.C.C# :cal SetSyn("cs") an 50.20.130 &Syntax.C.Cabal\ Haskell\ build\ file :cal SetSyn("cabal") an 50.20.140 &Syntax.C.Calendar :cal SetSyn("calendar") +an 50.20.140 &Syntax.C.Cangjie :cal SetSyn("cangjie") an 50.20.150 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css") an 50.20.160 &Syntax.C.CDL :cal SetSyn("cdl") an 50.20.170 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc") diff --git a/runtime/syntax/cangjie.vim b/runtime/syntax/cangjie.vim new file mode 100644 index 0000000000..8438a16e97 --- /dev/null +++ b/runtime/syntax/cangjie.vim @@ -0,0 +1,153 @@ +" Vim syntax file +" Language: Cangjie +" Maintainer: Wu Junkai +" Last Change: 2025 Aug 17 +" +" The Cangjie programming language is a new-generation programming +" language oriented to full-scenario intelligence. It features +" native intelligence, being naturally suitable for all scenarios, +" high performance and strong security. It is mainly applied in +" scenarios such as native applications and service applications +" of HarmonyOS NEXT, providing developers with a good programming +" experience. +" +" For more information, see: +" - https://cangjie-lang.cn/ +" - https://gitcode.com/Cangjie + +" quit when a syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +let s:save_cpo = &cpo +set cpo&vim + +" 0. check the user's settings +" use let g:cangjie__color to enable/disable syntax highlighting +function! s:enabled(item) abort + return get(g:, 'cangjie_' . a:item . '_color', 1) +endfunction + +syn case match + +" 1. comments +syn keyword cangjieTodo TODO FIXME XXX NOTE BUG contained +syn match cangjieComment /\v\/\/.*/ contains=cangjieTodo +syn region cangjieComment start=/\/\*/ end=/\*\// contains=cangjieTodo,@Spell + +" 2. keywords +syn keyword cangjieDeclaration abstract extend macro foreign +syn keyword cangjieDeclaration interface open operator override private prop protected +syn keyword cangjieDeclaration public redef static type +syn keyword cangjieStatement as break case catch continue do else finally for in +syn keyword cangjieStatement if in is match quote return spawn super synchronized +syn keyword cangjieStatement throw try unsafe where while +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 + +" 3. macro (e.g., @override) +syn match cangjieMacro /@\h\w*/ + +" 4. Type and Function Names +syn match cangjieTypeName /\h\w*/ contained + +" 5. specail identifiers +syn region cangjieSpIdentifier start=/`/ end=/`/ oneline + +" 6. types +syn keyword cangjieSpType Any Nothing Range Unit Iterable +syn keyword cangjieArrayType Array ArrayList VArray +syn keyword cangjieHashType HashMap HashSet +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 + +" 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 region cangjieRawString start='\z(#*\)#"' end='"#\z1' +syn region cangjieRawString start='\z(#*\)#\'' end='\'#\z1' + +" 8. number +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 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 + +" 9. operators +syn match cangjieOperator /[-+%<>!&|^*=]=\?/ +syn match cangjieOperator /\/\%(=\|\ze[^/*]\)/ +syn match cangjieOperator /\%(<<\|>>\|&^\)=\?/ +syn match cangjieOperator /:=\|||\|<-\|++\|--/ +syn match cangjieOperator /[~]/ +syn match cangjieOperator /[:]/ +syn match cangjieOperator /\.\./ +syn match cangjieVarArgs /\.\.\./ + +" finally, link the syntax groups to the highlight groups +if s:enabled('comment') + hi def link cangjieTodo Todo + hi def link cangjieComment Comment +endif +if s:enabled('identifier') + hi def link cangjieSpIdentifier Identifier +endif +if s:enabled('keyword') + hi def link cangjieDeclaration Keyword + hi def link cangjieStatement Statement + hi def link cangjieIdentlike Keyword + hi def link cangjieVariable Keyword + hi def link cangjieOption Keyword +endif +if s:enabled('macro') + hi def link cangjieMacro PreProc +endif +if s:enabled('number') + hi def link cangjieFloatNumber Float + hi def link cangjieScienceNumber Float + hi def link cangjieHexNumber Number + hi def link cangjieOctalNumber Number + hi def link cangjieBinaryNumber Number + hi def link cangjieDecimalNumber Number +endif +if s:enabled('operator') + hi def link cangjieOperator Operator + hi def link cangjieVarArgs Operator +endif +if s:enabled('string') + hi def link cangjieRune Character + hi def link cangjieString String + hi def link cangjieRawString String +endif +if s:enabled('type') + hi def link cangjieTypeName Type + hi def link cangjieSpType Type + hi def link cangjieArrayType Type + hi def link cangjieHashType Type + hi def link cangjieCommonType Type + hi def link cangjieFloatType Type + hi def link cangjieIntType Type + hi def link cangjieUIntType Type +endif + +let b:current_syntax = "cangjie" + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 82f4db7a9a..8ac4f54ee3 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -156,6 +156,7 @@ def s:GetFilenameChecks(): dict> cabalproject: ['cabal.project', 'cabal.project.local'], cairo: ['file.cairo'], calendar: ['calendar', '/.calendar/file', '/share/calendar/any/calendar.file', '/share/calendar/calendar.file', 'any/share/calendar/any/calendar.file', 'any/share/calendar/calendar.file'], + cangjie: ['file.cj'], capnp: ['file.capnp'], catalog: ['catalog', 'sgml.catalogfile', 'sgml.catalog', 'sgml.catalog-file'], cdc: ['file.cdc'], diff --git a/src/version.c b/src/version.c index fd7849cba5..c62e443ff8 100644 --- a/src/version.c +++ b/src/version.c @@ -719,6 +719,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1647, /**/ 1646, /**/