]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1647: filetype: Cangjie files are not recognized v9.1.1647
authorWuJunkai2004 <wujunkai20041123@outlook.com>
Mon, 18 Aug 2025 18:53:34 +0000 (20:53 +0200)
committerChristian Brabandt <cb@256bit.org>
Mon, 18 Aug 2025 18:53:34 +0000 (20:53 +0200)
Problem:  filetype: Cangjie files are not recognized
Solution: Detect *.cj files as cangjie filetype, include a syntax plugin
          (WuJunkai2004)

This commit introduces a new syntax highlighting file for the Cangjie
programming language, includes 4 parts as required:
- The main syntax file: runtime/syntax/cangjie.vim
- The filetype detection rule in: runtime/filetype.vim
- The documentation update in: runtime/doc/syntax.txt
- Some menus

References:
- https://gitcode.com/Cangjie
- https://cangjie-lang.cn/

fixes: 18014
closes: #18027

Signed-off-by: WuJunkai2004 <wujunkai20041123@outlook.com>
Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
.github/MAINTAINERS
runtime/doc/syntax.txt
runtime/doc/tags
runtime/filetype.vim
runtime/makemenu.vim
runtime/synmenu.vim
runtime/syntax/cangjie.vim [new file with mode: 0644]
src/testdir/test_filetype.vim
src/version.c

index 26cc51af090e4e71da7c9eff4cd2b88a3cdc9b6d..236e3567ccdf2f1dacb71bfad9b3bcdafe9012bd 100644 (file)
@@ -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
index 9fe4be552a9602ab90f0d19c50ba1d02a09d8433..2aecb65a6b666760b67ad2281b3666da6de3f363 100644 (file)
@@ -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
index 9a0f8f2cf2449b4c684713ef3baa0354db14c196..63c1506f15bc808a6dfbc8e4b9454bfcdeee6279 100644 (file)
@@ -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*
index 02224157852212429a6194ac876c0f81bf063c95..1b0e4183f9767cefcd6d01bb4d816f0de7a90545 100644 (file)
@@ -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
index 8ef1788894d24159921b7cee23613cdc11541635..3cff23db2a87c70d05e2f5dff990a67bcc95278a 100644 (file)
@@ -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
index 164b04f9ae5ed219f29f9ae8a3b3700f5b32700f..5d3321585efc252e80806cf83a8dfa338b91db30 100644 (file)
@@ -110,6 +110,7 @@ an 50.20.110 &Syntax.C.C++ :cal SetSyn("cpp")<CR>
 an 50.20.120 &Syntax.C.C# :cal SetSyn("cs")<CR>
 an 50.20.130 &Syntax.C.Cabal\ Haskell\ build\ file :cal SetSyn("cabal")<CR>
 an 50.20.140 &Syntax.C.Calendar :cal SetSyn("calendar")<CR>
+an 50.20.140 &Syntax.C.Cangjie :cal SetSyn("cangjie")<CR>
 an 50.20.150 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css")<CR>
 an 50.20.160 &Syntax.C.CDL :cal SetSyn("cdl")<CR>
 an 50.20.170 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc")<CR>
diff --git a/runtime/syntax/cangjie.vim b/runtime/syntax/cangjie.vim
new file mode 100644 (file)
index 0000000..8438a16
--- /dev/null
@@ -0,0 +1,153 @@
+" Vim syntax file
+" Language: Cangjie
+" Maintainer: Wu Junkai <wu.junkai@qq.com>
+" 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_<item>_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
index 82f4db7a9aec84ab21e53ba0f852760b2bddcaf8..8ac4f54ee37d857acbb978a1b3cf50e79b36182b 100644 (file)
@@ -156,6 +156,7 @@ def s:GetFilenameChecks(): dict<list<string>>
     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'],
index fd7849cba59122c9f780959381a397f50f43c7d6..c62e443ff856ffc52a058e39f93684d92d2f2a0b 100644 (file)
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1647,
 /**/
     1646,
 /**/