From 20242b3f4c0d49aa45f482ee0fcbf05958410208 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 28 Dec 2025 01:02:03 -0700 Subject: [PATCH] allow the creation of "language regions" in syntax - use a comment block containing `#language:` to start a langauge regions e.g. '<%# #langauge:cpp %>' - use a comment block containing `#endlangaue` to end a region e.g. '<%# #endlangauge $>' contains definitions for `rust`, `cpp`, and `html` blocks in vscode and vim syntax --- syntax/vim/syntax/sailfish.vim | 8 ++ .../vscode/syntaxes/sailfish.tmLanguage.json | 78 ++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/syntax/vim/syntax/sailfish.vim b/syntax/vim/syntax/sailfish.vim index 13971364..6a237d1e 100644 --- a/syntax/vim/syntax/sailfish.vim +++ b/syntax/vim/syntax/sailfish.vim @@ -3,15 +3,23 @@ " Maintainer: Ryohei Machida " License: MIT +let main_syntax = 'sailfish' runtime! syntax/html.vim unlet b:current_syntax syn include @rustSyntax syntax/rust.vim +unlet b:current_syntax + +syn include @cppSyntax syntax/cpp.vim syn region sailfishCodeBlock matchgroup=sailfishTag start=/<%/ keepend end=/%>/ contains=@rustSyntax syn region sailfishBufferBlock matchgroup=sailfishTag start=/<%=/ keepend end=/%>/ contains=@rustSyntax syn region sailfishCommentBlock start=/<%#/ end=/%>/ +syn region sailfishLanguageBlockCpp matchgroup=sailfishTag start=/<%#\s*#language:cpp\s*%>/ keepend end=/<%#\s*#endlanguage\s*%>/ contains=@cppSyntax,sailfishCodeBlock,sailfishBufferBlock,sailfishCommentBlock +syn region sailfishLanguageBlockRust matchgroup=sailfishTag start=/<%#\s*#language:rust\s*%>/ keepend end=/<%#\s*#endlanguage\s*%>/ contains=@rustSyntax,sailfishCodeBlock,sailfishBufferBlock,sailfishCommentBlock + + " Redefine htmlTag so that it can contain jspExpr syn clear htmlString syn region htmlString contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,sailfishCodeBlock,sailfishBufferBlock diff --git a/syntax/vscode/syntaxes/sailfish.tmLanguage.json b/syntax/vscode/syntaxes/sailfish.tmLanguage.json index 4b36b59f..38f10729 100644 --- a/syntax/vscode/syntaxes/sailfish.tmLanguage.json +++ b/syntax/vscode/syntaxes/sailfish.tmLanguage.json @@ -356,6 +356,9 @@ }, "name": "sailfish", "patterns": [ + { + "include": "#languagemarkerblock" + }, { "include": "#commentblock" }, @@ -367,6 +370,79 @@ } ], "repository": { + "languagemarkerblock": { + "patterns": [ + { + "name": "meta.block.embedded.cpp", + "begin": "<(%|\\?)#\\s*#language:cpp\\s*(%|\\?)>", + "beginCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.html" + } + }, + "end": "<(%|\\?)#\\s*#endlanguage\\s*(%|\\?)>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.html" + } + }, + "patterns": [ + { + "include": "$self" + }, + { + "include": "source.cpp" + } + ] + }, + { + "name": "meta.block.embedded.rust", + "begin": "<(%|\\?)#\\s*#language:rust\\s*(%|\\?)>", + "beginCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.html" + } + }, + "end": "<(%|\\?)#\\s*#endlanguage\\s*(%|\\?)>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.html" + } + }, + "patterns": [ + { + "include": "$self" + }, + { + "include": "source.rust" + } + ] + }, + { + "name": "meta.block.embedded.html", + "begin": "<(%|\\?)#\\s*#language:html\\s*(%|\\?)>", + "beginCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.html" + } + }, + "end": "<(%|\\?)#\\s*#endlanguage\\s*(%|\\?)>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.html" + } + }, + "patterns": [ + { + "include": "$self" + }, + { + "include": "text.html.basic" + } + ] + } + ] + }, "commentblock": { "patterns": [ { @@ -384,7 +460,7 @@ "codeblock": { "patterns": [ { - "name": "source.rust.embedded.html", + "name": "meta.block.embedded.rust", "begin": "<(%|\\?)(=|-)?", "beginCaptures": { "0": {