diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d2f6bca071bdea8170236786cded51982ce5a01a --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# c3.vim + +Vim support for the [C3 programming language](https://c3-lang.org/). + +## Features + +- Filetype detection (`*.c3`) +- Syntax highlighting +- Indentation (C-style) +- Compiler integration (`:compiler c3c`) +- Basic buffer-local settings (`shiftwidth`, `tabstop`, `commentstring`) + +## Installation + +### Using [lazy.nvim](https://github.com/folke/lazy.nvim) + +```lua +{ "your-username/c3.vim" } +``` + +### Using [vim-plug](https://github.com/junegunn/vim-plug) + +```vim +Plug 'your-username/c3.vim' +``` + +### Manual Installation + +Clone this repository into your Vim/Neovim plugin directory: + +```bash +git clone https://github.com/your-username/c3.vim ~/.vim/pack/plugins/start/c3.vim +# OR for Neovim +git clone https://github.com/your-username/c3.vim ~/.local/share/nvim/site/pack/plugins/start/c3.vim +``` + +## Usage + +The plugin automatically detects `.c3` files. + +To use the compiler integration: +```vim +:compiler c3c +:make +``` diff --git a/compiler/c3c.vim b/compiler/c3c.vim new file mode 100644 index 0000000000000000000000000000000000000000..7b0d83ed67a48cc0ee67010691b6a469c6e5fca4 --- /dev/null +++ b/compiler/c3c.vim @@ -0,0 +1,18 @@ +if exists("current_compiler") + finish +endif +let current_compiler = "c3c" + +if exists(":CompilerSet") != 2 + command -nargs=* CompilerSet setlocal +endif + +CompilerSet makeprg=c3c + +let s:cpo_save = &cpo +set cpo-=C + +CompilerSet errorformat=(%f:%l:%c)\ %m + +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/doc/c3.txt b/doc/c3.txt new file mode 100644 index 0000000000000000000000000000000000000000..658c6431ef657aeecb42dcef3dbce5b7095c7f7c --- /dev/null +++ b/doc/c3.txt @@ -0,0 +1,42 @@ +*c3.txt* For Vim version 9.0. Last change: 2024 May 15 + +C3 LANGUAGE SUPPORT *c3* + +INTRODUCTION *c3-intro* + +This plugin provides syntax highlighting, filetype detection, +and compiler support for the C3 programming language. + +FEATURES *c3-features* + +- Filetype detection (*.c3) +- Syntax highlighting +- Indentation (C-style) +- Compiler integration (:compiler c3c) +- Basic buffer-local settings + +USAGE *c3-usage* + +The plugin automatically detects .c3 files and sets the filetype to 'c3'. + +COMPILER SUPPORT *c3-compiler* + +To use the compiler integration, run: +> + :compiler c3c + :make +< +This sets 'makeprg' to 'c3c' and configures the 'errorformat' to +properly parse C3 compiler errors. + +SETTINGS *c3-settings* + +The plugin sets the following buffer-local options for C3 files: + +- 'shiftwidth' to 4 +- 'tabstop' to 4 +- 'softtabstop' to 4 +- 'expandtab' +- 'commentstring' to // %s + +vim:tw=78:ts=8:ft=help:norl: diff --git a/ftdetect/c3.vim b/ftdetect/c3.vim new file mode 100644 index 0000000000000000000000000000000000000000..ec712cd54392e34317d267d4972daf53c6593c71 --- /dev/null +++ b/ftdetect/c3.vim @@ -0,0 +1 @@ +autocmd BufNewFile,BufRead *.c3 setfiletype c3 diff --git a/ftplugin/c3.vim b/ftplugin/c3.vim new file mode 100644 index 0000000000000000000000000000000000000000..b54314f04b8a6550dbd11e499ef98981142ea7bd --- /dev/null +++ b/ftplugin/c3.vim @@ -0,0 +1,12 @@ +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +setlocal commentstring=//\ %s +setlocal shiftwidth=4 +setlocal tabstop=4 +setlocal softtabstop=4 +setlocal expandtab + +let b:undo_ftplugin = "setl cms< sw< ts< sts< et<" diff --git a/indent/c3.vim b/indent/c3.vim new file mode 100644 index 0000000000000000000000000000000000000000..1e949009b2b9e9da984afd09267dae96d021e692 --- /dev/null +++ b/indent/c3.vim @@ -0,0 +1,9 @@ +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal cindent +setlocal cinoptions=L0,(0,W4 + +let b:undo_indent = "setl cin< cino<" diff --git a/syntax/c3.vim b/syntax/c3.vim new file mode 100644 index 0000000000000000000000000000000000000000..c7c8d22d0a9b38fa7ddab4c77a726b02204ea9fb --- /dev/null +++ b/syntax/c3.vim @@ -0,0 +1,170 @@ +if exists("b:current_syntax") + finish +endif + +syn match c3Identifier display "\v<_*[a-z][A-Za-z0-9_]*>" +syn match c3Function display "\zs\(\w*\)*\s*\ze(" +syn match c3Macro display "@\zs\(\w*\)*\s*\ze(" +syn match c3UserAttr display "@_*[A-Z][A-Z0-9_]*[a-z][a-zA-Z0-9_]*" +syn match c3GlobalConst display "_*[A-Z][A-Z0-9_]\+" +syn match c3UserType display "_*[A-Z][A-Z0-9_]*[a-z][a-zA-Z0-9_]*" +syn match c3Label display "^\s*_*[A-Z][A-Z0-9_]\+:" +syn match c3ComptimeId display "\v\$<_*[a-z][A-Za-z0-9_]*>" + +syn match c3Number display "\v<0[Xx][0-9A-Fa-f](_*[0-9A-Fa-f])*>" +syn match c3Number display "\v<0[Oo][0-7](_*[0-7])*>" +syn match c3Number display "\v<0[Bb][01](_*[01])*>" +syn match c3Number display "\v<[0-9](_*[0-9])*([iu](8|16|32|64|128)|([Uu][Ll]?|[Ll]))?>" + +syn match c3Float display "\v<[0-9](_*[0-9])*[Ee][+-]?[0-9]+(f(8|16|32|64|128))?>" +syn match c3Float display "\v<0[Xx][0-9A-Fa-f](_*[0-9A-Fa-f])*[Pp][+-]?[0-9]+(f(8|16|32|64|128))?>" +syn match c3Float display "\v<[0-9](_*[0-9])*\.[0-9](_*[0-9])*([Ee][+-]?[0-9]+)?(f(8|16|32|64|128))?>" +syn match c3Float display "\v<0[Xx][0-9A-Fa-f](_*[0-9A-Fa-f])*\.[0-9A-Fa-f](_*[0-9A-Fa-f])*([Pp][+-]?[0-9]+)?(f(8|16|32|64|128))?>" + +syn match c3Operator display "\v\.\.\.?" +syn match c3Operator display "\v(\<\<|\>\>|[<>=!+*/%&~^|-])\=?" +syn match c3Operator display "\v\+\+|--|\&\&|\|\||\?\?|::|\?:|\=>|[\[]<|>[\]]|\$\$" + +syn match c3Delimiter display "\v[;,:\{\}\(\)\[\].?]" + +syn match c3HexBytes display "\v" +syn match c3Contract contained "\v<\@ensure>" +syn match c3Contract contained "\v<\@param\s+\[(in|out|inout)\]" +syn match c3Contract contained "\v<\@pure>" + +syn keyword c3Todo todo Todo TODO contained + +" TODO: Comment nesting + +syn keyword c3Keyword + \ if else + \ try catch + \ defer return + \ switch case nextcase default + \ cast asm + \ def alias faultdef typedef fn enum macro fault struct bitstruct interface + \ module import + +syn keyword c3Repeat + \ do while while + \ for foreach foreach_r + \ continue break + +syn keyword c3Specifier extern inline static tlocal +syn keyword c3Specifier var const + +syn keyword c3BuiltinType typeid errtype void any anyfault bool +syn keyword c3BuiltinType ichar short int long int128 isz iptr +syn keyword c3BuiltinType char ushort uint ulong uint128 usz uptr +syn keyword c3BuiltinType float16 float double float128 +syn keyword c3BuiltinType String ZString WString DString + +syn keyword c3Null null +syn keyword c3Boolean true false + +syn match c3BuiltinAttr display "\v\@align" +syn match c3BuiltinAttr display "\v\@benchmark" +syn match c3BuiltinAttr display "\v\@bigendian" +syn match c3BuiltinAttr display "\v\@builtin" +syn match c3BuiltinAttr display "\v\@callconv" +syn match c3BuiltinAttr display "\v\@deprecated" +syn match c3BuiltinAttr display "\v\@dynamic" +syn match c3BuiltinAttr display "\v\@export" +syn match c3BuiltinAttr display "\v\@extern" +syn match c3BuiltinAttr display "\v\@if" +syn match c3BuiltinAttr display "\v\@inline" +syn match c3BuiltinAttr display "\v\@interface" +syn match c3BuiltinAttr display "\v\@littleendian" +syn match c3BuiltinAttr display "\v\@local" +syn match c3BuiltinAttr display "\v\@maydiscard" +syn match c3BuiltinAttr display "\v\@naked" +syn match c3BuiltinAttr display "\v\@nodiscard" +syn match c3BuiltinAttr display "\v\@noinit" +syn match c3BuiltinAttr display "\v\@noreturn" +syn match c3BuiltinAttr display "\v\@nostrip" +syn match c3BuiltinAttr display "\v\@obfuscate" +syn match c3BuiltinAttr display "\v\@operator" +syn match c3BuiltinAttr display "\v\@optional" +syn match c3BuiltinAttr display "\v\@overlap" +syn match c3BuiltinAttr display "\v\@priority" +syn match c3BuiltinAttr display "\v\@private" +syn match c3BuiltinAttr display "\v\@public" +syn match c3BuiltinAttr display "\v\@pure" +syn match c3BuiltinAttr display "\v\@reflect" +syn match c3BuiltinAttr display "\v\@section" +syn match c3BuiltinAttr display "\v\@test" +syn match c3BuiltinAttr display "\v\@used" +syn match c3BuiltinAttr display "\v\@unused" + +syn match c3ComptimeKw display "\$and" +syn match c3ComptimeKw display "\$assert" +syn match c3ComptimeKw display "\$case" +syn match c3ComptimeKw display "\$default" +syn match c3ComptimeKw display "\$echo" +syn match c3ComptimeKw display "\$else" +syn match c3ComptimeKw display "\$error" +syn match c3ComptimeKw display "\$endfor" +syn match c3ComptimeKw display "\$endforeach" +syn match c3ComptimeKw display "\$endif" +syn match c3ComptimeKw display "\$endswitch" +syn match c3ComptimeKw display "\$for" +syn match c3ComptimeKw display "\$foreach" +syn match c3ComptimeKw display "\$if" +syn match c3ComptimeKw display "\$switch" +syn match c3ComptimeKw display "\$typef" +syn match c3ComptimeKw display "\$vaarg" +syn match c3ComptimeKw display "\$vaconst" +syn match c3ComptimeKw display "\$vacount" +syn match c3ComptimeKw display "\$varef" +syn match c3ComptimeKw display "\$vatype" + +hi def link c3Number Number +hi def link c3Float Number +hi def link c3Identifier Identifier +hi def link c3ComptimeId Identifier + +if hlexists('@namespace') + hi def link c3UserAttr @namespace + hi def link c3BuiltinAttr @namespace +else + hi def link c3UserAttr Special + hi def link c3BuiltinAttr Special +endif + +hi def link c3Function Function +hi def link c3Macro Macro +hi def link c3BuiltinType Type +hi def link c3Label Label +hi def link c3UserType Type +hi def link c3Keyword Keyword +hi def link c3ComptimeKw Keyword +hi def link c3Specifier StorageClass +hi def link c3Repeat Repeat +hi def link c3Boolean Boolean +hi def link c3Null Boolean +hi def link c3GlobalConst Constant +hi def link c3String String +hi def link c3HexBytes String +hi def link c3Base64 String +hi def link c3Operator Operator +hi def link c3Delimiter Delimiter +hi def link c3Comment Comment +hi def link c3Contract Comment + +let b:current_syntax = "c3" +