editor sync
parent
6e39436792
commit
8feb515d33
|
@ -109,6 +109,7 @@ char* lt_key_name(char *dst, int key, int vk, int mods) {
|
||||||
if( key == GLFW_KEY_RIGHT_CONTROL ) return "right ctrl";
|
if( key == GLFW_KEY_RIGHT_CONTROL ) return "right ctrl";
|
||||||
if( key == GLFW_KEY_LEFT_SUPER ) return "left windows";
|
if( key == GLFW_KEY_LEFT_SUPER ) return "left windows";
|
||||||
if( key == GLFW_KEY_RIGHT_SUPER ) return "left windows";
|
if( key == GLFW_KEY_RIGHT_SUPER ) return "left windows";
|
||||||
|
if( key == GLFW_KEY_MENU ) return "menu";
|
||||||
|
|
||||||
if( key == GLFW_KEY_ESCAPE ) return "escape";
|
if( key == GLFW_KEY_ESCAPE ) return "escape";
|
||||||
if( key == GLFW_KEY_BACKSPACE ) return "backspace";
|
if( key == GLFW_KEY_BACKSPACE ) return "backspace";
|
||||||
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
After Width: | Height: | Size: 104 KiB |
|
@ -0,0 +1,2 @@
|
||||||
|
Free & Open Sourced Logos
|
||||||
|
At Fairpixels, we had unused logo designs piling up on our hard drives and decided to make them available to the world, for free. The logos below can be downloaded unlimited times and used by anyone. For personal & commercial projects. No attribution required. Perfect for mvp's and mockups.
|
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
|
@ -0,0 +1,14 @@
|
||||||
|
https://uxwing.com/license/
|
||||||
|
|
||||||
|
Permitted:
|
||||||
|
- All icons on UXWing free to download, and use personal, commercial projects.
|
||||||
|
- Attribution and Credit is NOT required, however, any credit will be much appreciated.
|
||||||
|
- There is no limit to the number of times you can use.
|
||||||
|
- You may modify the resources according to your requirements.
|
||||||
|
|
||||||
|
Brand icons:
|
||||||
|
- All brand logos /icons are trademarks of their respective owners/entities. This should only be used to represent the company or product to which they refer.
|
||||||
|
|
||||||
|
Prohibitions:
|
||||||
|
- Resell, Direct redistribute, Sub-license, Claim credit, or Ownership of any of the icons.
|
||||||
|
- Don’t use this material for SPAM websites, illegal business, illegal activity, and hate/crime.
|
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
|
@ -0,0 +1 @@
|
||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 122.88 122.88"><title>scale-ruler</title><path d="M91.87.85,122,31a2.94,2.94,0,0,1,.35.44,2.82,2.82,0,0,1,.49,1.6,2.85,2.85,0,0,1-.84,2l-87,87a3,3,0,0,1-.54.41,2.77,2.77,0,0,1-1.49.43,2.9,2.9,0,0,1-2-.84L.84,91.88a2.89,2.89,0,0,1,0-4.07l87-87a2.88,2.88,0,0,1,2-.84,2.82,2.82,0,0,1,2,.85ZM37.27,112.23l-7.91-7.91,3.8-3.8,7.91,7.91,4.25-4.25L31,89.84l3.8-3.8,14.34,14.34,4.25-4.24-7.91-7.92,3.8-3.8,7.91,7.91,4.25-4.24L47.07,73.74l3.8-3.8L65.22,84.29,69.47,80l-7.91-7.91,3.8-3.8,7.91,7.91L77.52,72,63.17,57.64l3.8-3.8L81.32,68.19l4.24-4.25L77.65,56l3.8-3.8,7.91,7.91,4.25-4.25L79.27,41.55l3.8-3.8L97.41,52.09,116.47,33,89.84,6.41,6.41,89.84,33,116.47l4.23-4.24ZM98,28.56a3.69,3.69,0,0,0-3.69-3.69,3.69,3.69,0,0,0-2.61,6.3l.08.09a3.71,3.71,0,0,0,5.14-.09l.08-.08a3.68,3.68,0,0,0,1-2.53Zm1.71-5.4a7.63,7.63,0,0,1,.12,10.68l-.12.13A7.64,7.64,0,0,1,89,34.08L88.91,34a7.64,7.64,0,0,1,10.81-10.8Z"/></svg>
|
After Width: | Height: | Size: 983 B |
|
@ -0,0 +1,61 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
-- batch syntax for lite <liqube>
|
||||||
|
|
||||||
|
-- windows batch files use caseless matching for symbols
|
||||||
|
local symtable = {
|
||||||
|
["keyword"] = {
|
||||||
|
"if", "else", "elsif", "not", "for", "do", "in",
|
||||||
|
"equ", "neq", "lss", "leq", "gtr", "geq", -- == != < <= > >=
|
||||||
|
"nul", "con", "prn", "prn", "lpt1", "com1", "com2", "com3", "com4",
|
||||||
|
"exist", "defined",
|
||||||
|
"errorlevel", "cmdextversion",
|
||||||
|
"goto", "call", "verify",
|
||||||
|
},
|
||||||
|
["function"] = {
|
||||||
|
"set", "setlocal", "endlocal", "enabledelayedexpansion",
|
||||||
|
"echo", "type",
|
||||||
|
"cd", "chdir",
|
||||||
|
"md", "mkdir",
|
||||||
|
"pause", "choice", "exit",
|
||||||
|
"del", "rd", "rmdir",
|
||||||
|
"copy", "xcopy",
|
||||||
|
"move", "ren",
|
||||||
|
"find", "findstr",
|
||||||
|
"sort", "shift", "attrib",
|
||||||
|
"cmd", "command",
|
||||||
|
"forfiles",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
-- prepare a mixed symbol list
|
||||||
|
local function prepare_symbols(symtable)
|
||||||
|
local symbols = { }
|
||||||
|
for symtype, symlist in pairs(symtable) do
|
||||||
|
for _, symname in ipairs(symlist) do
|
||||||
|
symbols[symname:lower()] = symtype
|
||||||
|
symbols[symname:upper()] = symtype
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return symbols
|
||||||
|
end
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = { "%.bat$", "%.cmd$" },
|
||||||
|
comment = "rem",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "@echo off\n", type = "keyword" },
|
||||||
|
{ pattern = "@echo on\n", type = "keyword" },
|
||||||
|
{ pattern = "rem.-\n", type = "comment" }, -- rem comment line, rem, rem.
|
||||||
|
{ pattern = "REM.-\n", type = "comment" },
|
||||||
|
{ pattern = "%s*:[%w%-]+", type = "symbol" }, -- :labels
|
||||||
|
{ pattern = "%:%:.-\n", type = "comment" }, -- :: comment line
|
||||||
|
{ pattern = "%%%w+%%", type = "symbol" }, -- %variable%
|
||||||
|
{ pattern = "%%%%?~?[%w:]+", type = "symbol" }, -- %1, %~dpn1, %~1:2, %%i, %%~i
|
||||||
|
{ pattern = "[!=()%>&%^/\\@]", type = "operator" }, -- operators
|
||||||
|
{ pattern = "-?%.?%d+f?", type = "number" }, -- integer numbers
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" }, -- "strings"
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "normal" },
|
||||||
|
{ pattern = ":eof", type = "keyword" }, -- not quite as intended, but ok for now
|
||||||
|
},
|
||||||
|
symbols = prepare_symbols(symtable),
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
-- batch syntax for lite <liqube>
|
||||||
|
|
||||||
|
-- windows batch files use caseless matching for symbols
|
||||||
|
local symtable = {
|
||||||
|
["keyword"] = {
|
||||||
|
"if", "else", "elsif", "not", "for", "do", "in",
|
||||||
|
"equ", "neq", "lss", "leq", "gtr", "geq", -- == != < <= > >=
|
||||||
|
"nul", "con", "prn", "prn", "lpt1", "com1", "com2", "com3", "com4",
|
||||||
|
"exist", "defined",
|
||||||
|
"errorlevel", "cmdextversion",
|
||||||
|
"goto", "call", "verify",
|
||||||
|
},
|
||||||
|
["function"] = {
|
||||||
|
"set", "setlocal", "endlocal", "enabledelayedexpansion",
|
||||||
|
"echo", "type",
|
||||||
|
"cd", "chdir",
|
||||||
|
"md", "mkdir",
|
||||||
|
"pause", "choice", "exit",
|
||||||
|
"del", "rd", "rmdir",
|
||||||
|
"copy", "xcopy",
|
||||||
|
"move", "ren",
|
||||||
|
"find", "findstr",
|
||||||
|
"sort", "shift", "attrib",
|
||||||
|
"cmd", "command",
|
||||||
|
"forfiles",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
-- prepare a mixed symbol list
|
||||||
|
local function prepare_symbols(symtable)
|
||||||
|
local symbols = { }
|
||||||
|
for symtype, symlist in pairs(symtable) do
|
||||||
|
for _, symname in ipairs(symlist) do
|
||||||
|
symbols[symname:lower()] = symtype
|
||||||
|
symbols[symname:upper()] = symtype
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return symbols
|
||||||
|
end
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = { "%.bat$", "%.cmd$" },
|
||||||
|
comment = "rem",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "@echo off\n", type = "keyword" },
|
||||||
|
{ pattern = "@echo on\n", type = "keyword" },
|
||||||
|
{ pattern = "rem.-\n", type = "comment" }, -- rem comment line, rem, rem.
|
||||||
|
{ pattern = "REM.-\n", type = "comment" },
|
||||||
|
{ pattern = "%s*:[%w%-]+", type = "symbol" }, -- :labels
|
||||||
|
{ pattern = "%:%:.-\n", type = "comment" }, -- :: comment line
|
||||||
|
{ pattern = "%%%w+%%", type = "symbol" }, -- %variable%
|
||||||
|
{ pattern = "%%%%?~?[%w:]+", type = "symbol" }, -- %1, %~dpn1, %~1:2, %%i, %%~i
|
||||||
|
{ pattern = "[!=()%>&%^/\\@]", type = "operator" }, -- operators
|
||||||
|
{ pattern = "-?%.?%d+f?", type = "number" }, -- integer numbers
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" }, -- "strings"
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "normal" },
|
||||||
|
{ pattern = ":eof", type = "keyword" }, -- not quite as intended, but ok for now
|
||||||
|
},
|
||||||
|
symbols = prepare_symbols(symtable),
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
pcall(require, "plugins.language_c")
|
||||||
|
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = {
|
||||||
|
"%.h$", "%.inl$", "%.cpp$", "%.cc$", "%.C$", "%.cxx$",
|
||||||
|
"%.c++$", "%.hh$", "%.H$", "%.hxx$", "%.hpp$", "%.h++$"
|
||||||
|
},
|
||||||
|
comment = "//",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "//.-\n", type = "comment" },
|
||||||
|
{ pattern = { "/%*", "%*/" }, type = "comment" },
|
||||||
|
{ pattern = { "#", "[^\\]\n" }, type = "comment" },
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "string" },
|
||||||
|
{ pattern = "-?0x%x+", type = "number" },
|
||||||
|
{ pattern = "-?%d+[%d%.eE]*f?", type = "number" },
|
||||||
|
{ pattern = "-?%.?%d+f?", type = "number" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
|
||||||
|
{ pattern = "[%a_][%w_]*%f[(]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
["alignof"] = "keyword",
|
||||||
|
["alignas"] = "keyword",
|
||||||
|
["and"] = "keyword",
|
||||||
|
["and_eq"] = "keyword",
|
||||||
|
["not"] = "keyword",
|
||||||
|
["not_eq"] = "keyword",
|
||||||
|
["or"] = "keyword",
|
||||||
|
["or_eq"] = "keyword",
|
||||||
|
["xor"] = "keyword",
|
||||||
|
["xor_eq"] = "keyword",
|
||||||
|
["private"] = "keyword",
|
||||||
|
["protected"] = "keyword",
|
||||||
|
["public"] = "keyword",
|
||||||
|
["register"] = "keyword",
|
||||||
|
["nullptr"] = "keyword",
|
||||||
|
["operator"] = "keyword",
|
||||||
|
["asm"] = "keyword",
|
||||||
|
["bitand"] = "keyword",
|
||||||
|
["bitor"] = "keyword",
|
||||||
|
["catch"] = "keyword",
|
||||||
|
["throw"] = "keyword",
|
||||||
|
["try"] = "keyword",
|
||||||
|
["class"] = "keyword",
|
||||||
|
["compl"] = "keyword",
|
||||||
|
["explicit"] = "keyword",
|
||||||
|
["export"] = "keyword",
|
||||||
|
["concept"] = "keyword",
|
||||||
|
["consteval"] = "keyword",
|
||||||
|
["constexpr"] = "keyword",
|
||||||
|
["constinit"] = "keyword",
|
||||||
|
["const_cast"] = "keyword",
|
||||||
|
["dynamic_cast"] = "keyword",
|
||||||
|
["reinterpret_cast"] = "keyword",
|
||||||
|
["static_cast"] = "keyword",
|
||||||
|
["static_assert"] = "keyword",
|
||||||
|
["template"] = "keyword",
|
||||||
|
["this"] = "keyword",
|
||||||
|
["thread_local"] = "keyword",
|
||||||
|
["requires"] = "keyword",
|
||||||
|
["co_wait"] = "keyword",
|
||||||
|
["co_return"] = "keyword",
|
||||||
|
["co_yield"] = "keyword",
|
||||||
|
["decltype"] = "keyword",
|
||||||
|
["delete"] = "keyword",
|
||||||
|
["export"] = "keyword",
|
||||||
|
["friend"] = "keyword",
|
||||||
|
["typeid"] = "keyword",
|
||||||
|
["typename"] = "keyword",
|
||||||
|
["mutable"] = "keyword",
|
||||||
|
["virtual"] = "keyword",
|
||||||
|
["using"] = "keyword",
|
||||||
|
["namespace"] = "keyword",
|
||||||
|
["new"] = "keyword",
|
||||||
|
["noexcept"] = "keyword",
|
||||||
|
["if"] = "keyword",
|
||||||
|
["then"] = "keyword",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["elseif"] = "keyword",
|
||||||
|
["do"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["break"] = "keyword",
|
||||||
|
["continue"] = "keyword",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["goto"] = "keyword",
|
||||||
|
["struct"] = "keyword",
|
||||||
|
["union"] = "keyword",
|
||||||
|
["typedef"] = "keyword",
|
||||||
|
["enum"] = "keyword",
|
||||||
|
["extern"] = "keyword",
|
||||||
|
["static"] = "keyword",
|
||||||
|
["volatile"] = "keyword",
|
||||||
|
["const"] = "keyword",
|
||||||
|
["inline"] = "keyword",
|
||||||
|
["switch"] = "keyword",
|
||||||
|
["case"] = "keyword",
|
||||||
|
["default"] = "keyword",
|
||||||
|
["auto"] = "keyword",
|
||||||
|
["const"] = "keyword",
|
||||||
|
["void"] = "keyword",
|
||||||
|
["int"] = "keyword2",
|
||||||
|
["short"] = "keyword2",
|
||||||
|
["long"] = "keyword2",
|
||||||
|
["float"] = "keyword2",
|
||||||
|
["double"] = "keyword2",
|
||||||
|
["char"] = "keyword2",
|
||||||
|
["unsigned"] = "keyword2",
|
||||||
|
["bool"] = "keyword2",
|
||||||
|
["true"] = "keyword2",
|
||||||
|
["false"] = "keyword2",
|
||||||
|
["wchar_t"] = "keyword2",
|
||||||
|
["char8_t"] = "keyword2",
|
||||||
|
["char16_t"] = "keyword2",
|
||||||
|
["char32_t"] = "keyword2",
|
||||||
|
["NULL"] = "literal",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = "%.cs$",
|
||||||
|
comment = "//",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "//.-\n", type = "comment" },
|
||||||
|
{ pattern = { "/%*", "%*/" }, type = "comment" },
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "[%$%@]?\"", '"', '\\' }, type = "string" }, -- string interpolation and verbatim
|
||||||
|
{ pattern = "'\\x%x?%x?%x?%x'", type = "string" }, -- character hexadecimal escape sequence
|
||||||
|
{ pattern = "'\\u%x%x%x%x'", type = "string" }, -- character unicode escape sequence
|
||||||
|
{ pattern = "'\\?.'", type = "string" }, -- character literal
|
||||||
|
{ pattern = "-?0x%x+", type = "number" },
|
||||||
|
{ pattern = "-?%d+[%d%.eE]*f?", type = "number" },
|
||||||
|
{ pattern = "-?%.?%d+f?", type = "number" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
|
||||||
|
{ pattern = "%?%?", type = "operator" }, -- ?? null-coalescing
|
||||||
|
{ pattern = "%?%.", type = "operator" }, -- ?. null-conditional
|
||||||
|
{ pattern = "[%a_][%w_]*%f[(]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
-- keywords and contextual keywords
|
||||||
|
["abstract"] = "keyword",
|
||||||
|
["as"] = "keyword",
|
||||||
|
["add"] = "keyword",
|
||||||
|
["await"] = "keyword",
|
||||||
|
["base"] = "keyword",
|
||||||
|
["break"] = "keyword",
|
||||||
|
["case"] = "keyword",
|
||||||
|
["catch"] = "keyword",
|
||||||
|
["checked"] = "keyword",
|
||||||
|
["class"] = "keyword",
|
||||||
|
["record"] = "keyword",
|
||||||
|
["const"] = "keyword",
|
||||||
|
["continue"] = "keyword",
|
||||||
|
["default"] = "keyword",
|
||||||
|
["delegate"] = "keyword",
|
||||||
|
["do"] = "keyword",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["enum"] = "keyword",
|
||||||
|
["event"] = "keyword",
|
||||||
|
["explicit"] = "keyword",
|
||||||
|
["extern"] = "keyword",
|
||||||
|
["finally"] = "keyword",
|
||||||
|
["fixed"] = "keyword",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["foreach"] = "keyword",
|
||||||
|
["get"] = "keyword",
|
||||||
|
["goto"] = "keyword",
|
||||||
|
["if"] = "keyword",
|
||||||
|
["implicit"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["interface"] = "keyword",
|
||||||
|
["internal"] = "keyword",
|
||||||
|
["is"] = "keyword",
|
||||||
|
["lock"] = "keyword",
|
||||||
|
["namespace"] = "keyword",
|
||||||
|
["new"] = "keyword",
|
||||||
|
["operator"] = "keyword",
|
||||||
|
["out"] = "keyword",
|
||||||
|
["override"] = "keyword",
|
||||||
|
["remove"] = "keyword",
|
||||||
|
["params"] = "keyword",
|
||||||
|
["partial"] = "keyword",
|
||||||
|
["private"] = "keyword",
|
||||||
|
["protected"] = "keyword",
|
||||||
|
["dynamic"] = "keyword",
|
||||||
|
["public"] = "keyword",
|
||||||
|
["readonly"] = "keyword",
|
||||||
|
["ref"] = "keyword",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["sealed"] = "keyword",
|
||||||
|
["set"] = "keyword",
|
||||||
|
["sizeof"] = "keyword",
|
||||||
|
["stackalloc"] = "keyword",
|
||||||
|
["static"] = "keyword",
|
||||||
|
["struct"] = "keyword",
|
||||||
|
["switch"] = "keyword",
|
||||||
|
["this"] = "keyword",
|
||||||
|
["throw"] = "keyword",
|
||||||
|
["try"] = "keyword",
|
||||||
|
["typeof"] = "keyword",
|
||||||
|
["unchecked"] = "keyword",
|
||||||
|
["unsafe"] = "keyword",
|
||||||
|
["using"] = "keyword",
|
||||||
|
["var"] = "keyword",
|
||||||
|
["value"] = "keyword",
|
||||||
|
["global"] = "keyword",
|
||||||
|
["virtual"] = "keyword",
|
||||||
|
["void"] = "keyword",
|
||||||
|
["volatile"] = "keyword",
|
||||||
|
["where"] = "keyword",
|
||||||
|
["when"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
["yield"] = "keyword",
|
||||||
|
-- types
|
||||||
|
["bool"] = "keyword2",
|
||||||
|
["byte"] = "keyword2",
|
||||||
|
["char"] = "keyword2",
|
||||||
|
["decimal"] = "keyword2",
|
||||||
|
["double"] = "keyword2",
|
||||||
|
["float"] = "keyword2",
|
||||||
|
["int"] = "keyword2",
|
||||||
|
["long"] = "keyword2",
|
||||||
|
["object"] = "keyword2",
|
||||||
|
["sbyte"] = "keyword2",
|
||||||
|
["short"] = "keyword2",
|
||||||
|
["string"] = "keyword2",
|
||||||
|
["uint"] = "keyword2",
|
||||||
|
["ulong"] = "keyword2",
|
||||||
|
["ushort"] = "keyword2",
|
||||||
|
-- literals
|
||||||
|
["true"] = "literal",
|
||||||
|
["false"] = "literal",
|
||||||
|
["null"] = "literal",
|
||||||
|
},
|
||||||
|
}
|
|
@ -1,7 +1,11 @@
|
||||||
|
|
||||||
|
local style = require "core.style"
|
||||||
|
local common = require "core.common"
|
||||||
|
|
||||||
local syntax = require "core.syntax"
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
syntax.add {
|
syntax.add {
|
||||||
files = { "%.fx$", "%.glsl$", "%.fs$", "%.vs$", "%.gs$" },
|
files = { "%.glsl$", "%.frag$", "%.vert$", "%.vs$", "%.fs$", "%.gs$", "%.fx$", },
|
||||||
comment = "//",
|
comment = "//",
|
||||||
patterns = {
|
patterns = {
|
||||||
{ pattern = "//.-\n", type = "comment" },
|
{ pattern = "//.-\n", type = "comment" },
|
||||||
|
@ -13,55 +17,370 @@ syntax.add {
|
||||||
{ pattern = "-?%d+[%d%.eE]*f?", type = "number" },
|
{ pattern = "-?%d+[%d%.eE]*f?", type = "number" },
|
||||||
{ pattern = "-?%.?%d+f?", type = "number" },
|
{ pattern = "-?%.?%d+f?", type = "number" },
|
||||||
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
|
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
|
||||||
|
|
||||||
|
{ pattern = "ivec[2-4]", type = "keyword2" },
|
||||||
|
{ pattern = "bvec[2-4]", type = "keyword2" },
|
||||||
|
{ pattern = "uvec[2-4]", type = "keyword2" },
|
||||||
|
{ pattern = "vec[2-4]", type = "keyword2" },
|
||||||
|
{ pattern = "dmat[2-4]x[2-4]", type = "keyword2" },
|
||||||
|
{ pattern = "dmat[2-4]", type = "keyword2" },
|
||||||
|
{ pattern = "mat[2-4]x[2-4]", type = "keyword2" },
|
||||||
|
{ pattern = "mat[2-4]", type = "keyword2" },
|
||||||
|
|
||||||
{ pattern = "[%a_][%w_]*%f[(]", type = "function" },
|
{ pattern = "[%a_][%w_]*%f[(]", type = "function" },
|
||||||
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
},
|
},
|
||||||
symbols = {
|
symbols = {
|
||||||
|
--https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.60.pdf
|
||||||
|
--The symbols are added here in the order they appear in the spec
|
||||||
["if"] = "keyword",
|
["if"] = "keyword",
|
||||||
["then"] = "keyword",
|
|
||||||
["else"] = "keyword",
|
["else"] = "keyword",
|
||||||
["elseif"] = "keyword",
|
|
||||||
["do"] = "keyword",
|
["do"] = "keyword",
|
||||||
["while"] = "keyword",
|
["while"] = "keyword",
|
||||||
["for"] = "keyword",
|
["for"] = "keyword",
|
||||||
["break"] = "keyword",
|
["break"] = "keyword",
|
||||||
["continue"] = "keyword",
|
["continue"] = "keyword",
|
||||||
["return"] = "keyword",
|
["return"] = "keyword",
|
||||||
["goto"] = "keyword",
|
|
||||||
["struct"] = "keyword",
|
|
||||||
["union"] = "keyword",
|
|
||||||
["typedef"] = "keyword",
|
|
||||||
["enum"] = "keyword",
|
|
||||||
["extern"] = "keyword",
|
|
||||||
["static"] = "keyword",
|
|
||||||
["volatile"] = "keyword",
|
|
||||||
["const"] = "keyword",
|
["const"] = "keyword",
|
||||||
["inline"] = "keyword",
|
|
||||||
["switch"] = "keyword",
|
["switch"] = "keyword",
|
||||||
["case"] = "keyword",
|
["case"] = "keyword",
|
||||||
["default"] = "keyword",
|
["default"] = "keyword",
|
||||||
["auto"] = "keyword",
|
|
||||||
["const"] = "keyword",
|
["const"] = "keyword",
|
||||||
["void"] = "keyword",
|
["void"] = "keyword",
|
||||||
["uniform"] = "keyword",
|
["bool"] = "keyword2",
|
||||||
["in"] = "keyword",
|
|
||||||
["out"] = "keyword",
|
|
||||||
["inout"] = "keyword",
|
|
||||||
["int"] = "keyword2",
|
["int"] = "keyword2",
|
||||||
["short"] = "keyword2",
|
["uint"] = "keyword2",
|
||||||
["long"] = "keyword2",
|
|
||||||
["float"] = "keyword2",
|
["float"] = "keyword2",
|
||||||
["double"] = "keyword2",
|
["double"] = "keyword2",
|
||||||
["char"] = "keyword2",
|
|
||||||
["unsigned"] = "keyword2",
|
|
||||||
["bool"] = "keyword2",
|
|
||||||
["vec2"] = "keyword2",
|
|
||||||
["vec3"] = "keyword2",
|
|
||||||
["vec4"] = "keyword2",
|
|
||||||
["sampler2D"]= "keyword2",
|
|
||||||
["true"] = "literal",
|
["true"] = "literal",
|
||||||
["false"] = "literal",
|
["false"] = "literal",
|
||||||
["NULL"] = "literal",
|
["NULL"] = "literal",
|
||||||
|
|
||||||
|
["attribute"] = "keyword",
|
||||||
|
["varying"] = "keyword",
|
||||||
|
["uniform"] = "keyword",
|
||||||
|
["buffer"] = "keyword",
|
||||||
|
["shared"] = "keyword",
|
||||||
|
["layout"] = "keyword",
|
||||||
|
["centroid"] = "keyword",
|
||||||
|
["flat"] = "keyword",
|
||||||
|
["smooth"] = "keyword",
|
||||||
|
["noperspective"]= "keyword",
|
||||||
|
["patch"] = "keyword",
|
||||||
|
["sample"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["out"] = "keyword",
|
||||||
|
["inout"] = "keyword",
|
||||||
|
["invariant"] = "keyword",
|
||||||
|
["precise"] = "keyword",
|
||||||
|
["lowp"] = "keyword",
|
||||||
|
["mediump"] = "keyword",
|
||||||
|
["highp"] = "keyword",
|
||||||
|
["precision"] = "keyword",
|
||||||
|
["struct"] = "keyword",
|
||||||
|
["subroutine"] = "keyword",
|
||||||
|
|
||||||
|
["coherent"] = "keyword",
|
||||||
|
["volatile"] = "keyword",
|
||||||
|
["readonly"] = "keyword",
|
||||||
|
["writeonly"] = "keyword",
|
||||||
|
|
||||||
|
["sampler1D"] = "keyword2",
|
||||||
|
["sampler2D"] = "keyword2",
|
||||||
|
["sampler3D"] = "keyword2",
|
||||||
|
["samplerCube"] = "keyword2",
|
||||||
|
["sampler1DShadow"] = "keyword2",
|
||||||
|
["sampler2DShadow"] = "keyword2",
|
||||||
|
["samplerCubeShadow"] = "keyword2",
|
||||||
|
["sampler1DArray"] = "keyword2",
|
||||||
|
["sampler2DArray"] = "keyword2",
|
||||||
|
["samplerCubeArray"] = "keyword2",
|
||||||
|
["sampler1DArrayShadow"] = "keyword2",
|
||||||
|
["sampler2DArrayShadow"] = "keyword2",
|
||||||
|
["samplerCubeArrayShadow"]= "keyword2",
|
||||||
|
["isampler1D"] = "keyword2",
|
||||||
|
["isampler2D"] = "keyword2",
|
||||||
|
["isampler3D"] = "keyword2",
|
||||||
|
["isamplerCube"] = "keyword2",
|
||||||
|
["sampler2DMS"] = "keyword2",
|
||||||
|
["isampler2DMS"] = "keyword2",
|
||||||
|
["usampler2DMS"] = "keyword2",
|
||||||
|
["sampler2DMSArray"] = "keyword2",
|
||||||
|
["isampler2DMSArray"] = "keyword2",
|
||||||
|
["usampler2DMSArray"] = "keyword2",
|
||||||
|
["isampler1DArray"] = "keyword2",
|
||||||
|
["isampler2DArray"] = "keyword2",
|
||||||
|
["usampler1D"] = "keyword2",
|
||||||
|
["usampler2D"] = "keyword2",
|
||||||
|
["usampler3D"] = "keyword2",
|
||||||
|
["usamplerCube"] = "keyword2",
|
||||||
|
["usampler1DArray"] = "keyword2",
|
||||||
|
["usampler2DArray"] = "keyword2",
|
||||||
|
["sampler2DRect"] = "keyword2",
|
||||||
|
["sampler2DRectShadow"] = "keyword2",
|
||||||
|
["isampler2DRect"] = "keyword2",
|
||||||
|
["usampler2DRect"] = "keyword2",
|
||||||
|
["samplerBuffer"] = "keyword2",
|
||||||
|
["isamplerBuffer"] = "keyword2",
|
||||||
|
["usamplerBuffer"] = "keyword2",
|
||||||
|
|
||||||
|
["image1D"] = "keyword2",
|
||||||
|
["iimage1D"] = "keyword2",
|
||||||
|
["uimage1D"] = "keyword2",
|
||||||
|
["image1DArray"] = "keyword2",
|
||||||
|
["iimage1DArray"] = "keyword2",
|
||||||
|
["uimage1DArray"] = "keyword2",
|
||||||
|
["image2D"] = "keyword2",
|
||||||
|
["iimage2D"] = "keyword2",
|
||||||
|
["uimage2D"] = "keyword2",
|
||||||
|
["image2DArray"] = "keyword2",
|
||||||
|
["iimage2DArray"] = "keyword2",
|
||||||
|
["uimage2DArray"] = "keyword2",
|
||||||
|
["image2DRect"] = "keyword2",
|
||||||
|
["iimage2DRect"] = "keyword2",
|
||||||
|
["uimage2DRect"] = "keyword2",
|
||||||
|
["image2DMS"] = "keyword2",
|
||||||
|
["iimage2DMS"] = "keyword2",
|
||||||
|
["uimage2DMS"] = "keyword2",
|
||||||
|
["image2DMSArray"] = "keyword2",
|
||||||
|
["iimage2DMSArray"]= "keyword2",
|
||||||
|
["uimage2DMSArray"]= "keyword2",
|
||||||
|
["image3D"] = "keyword2",
|
||||||
|
["iimage3D"] = "keyword2",
|
||||||
|
["uimage3D"] = "keyword2",
|
||||||
|
["imageCube"] = "keyword2",
|
||||||
|
["iimageCube"] = "keyword2",
|
||||||
|
["uimageCube"] = "keyword2",
|
||||||
|
["imageCubeArray"] = "keyword2",
|
||||||
|
["iimageCubeArray"]= "keyword2",
|
||||||
|
["uimageCubeArray"]= "keyword2",
|
||||||
|
["imageBuffer"] = "keyword2",
|
||||||
|
["iimageBuffer"] = "keyword2",
|
||||||
|
["uimageBuffer"] = "keyword2",
|
||||||
|
|
||||||
|
["atomic_uint"] = "keyword2",
|
||||||
|
|
||||||
|
["radians"] = "keyword",
|
||||||
|
["degrees"] = "keyword",
|
||||||
|
["sin"] = "keyword",
|
||||||
|
["cos"] = "keyword",
|
||||||
|
["tan"] = "keyword",
|
||||||
|
["asin"] = "keyword",
|
||||||
|
["acos"] = "keyword",
|
||||||
|
["atan"] = "keyword",
|
||||||
|
["sinh"] = "keyword",
|
||||||
|
["cosh"] = "keyword",
|
||||||
|
["tanh"] = "keyword",
|
||||||
|
["asinh"] = "keyword",
|
||||||
|
["acosh"] = "keyword",
|
||||||
|
["pow"] = "keyword",
|
||||||
|
["exp"] = "keyword",
|
||||||
|
["exp2"] = "keyword",
|
||||||
|
["log2"] = "keyword",
|
||||||
|
["sqrt"] = "keyword",
|
||||||
|
["inversesqrt"] = "keyword",
|
||||||
|
["abs"] = "keyword",
|
||||||
|
["sign"] = "keyword",
|
||||||
|
["floor"] = "keyword",
|
||||||
|
["trunc"] = "keyword",
|
||||||
|
["round"] = "keyword",
|
||||||
|
["roundEven"] = "keyword",
|
||||||
|
["ceil"] = "keyword",
|
||||||
|
["fract"] = "keyword",
|
||||||
|
["mod"] = "keyword",
|
||||||
|
["modf"] = "keyword",
|
||||||
|
["min"] = "keyword",
|
||||||
|
["max"] = "keyword",
|
||||||
|
["clamp"] = "keyword",
|
||||||
|
["mix"] = "keyword",
|
||||||
|
["step"] = "keyword",
|
||||||
|
["smoothstep"] = "keyword",
|
||||||
|
["isnan"] = "keyword",
|
||||||
|
["isinf"] = "keyword",
|
||||||
|
["floatBitsToInt"] = "keyword",
|
||||||
|
["floatBitsToUint"] = "keyword",
|
||||||
|
["intBitsToFloat"] = "keyword",
|
||||||
|
["uintBitsToFloat"] = "keyword",
|
||||||
|
["fma"] = "keyword",
|
||||||
|
["frexp"] = "keyword",
|
||||||
|
["ldexp"] = "keyword",
|
||||||
|
["packUnorm2x16"] = "keyword",
|
||||||
|
["packSnorm2x16"] = "keyword",
|
||||||
|
["packUnorm4x8"] = "keyword",
|
||||||
|
["packSnorm4x8"] = "keyword",
|
||||||
|
["unpackUnorm2x16"] = "keyword",
|
||||||
|
["unpackSnorm2x16"] = "keyword",
|
||||||
|
["unpackUnorm4x8"] = "keyword",
|
||||||
|
["unpackSnorm4x8"] = "keyword",
|
||||||
|
["packHalf2x16"] = "keyword",
|
||||||
|
["unpackHalf2x16"] = "keyword",
|
||||||
|
["packDouble2x32"] = "keyword",
|
||||||
|
["unpackDouble2x32"] = "keyword",
|
||||||
|
["length"] = "keyword",
|
||||||
|
["distance"] = "keyword",
|
||||||
|
["dot"] = "keyword",
|
||||||
|
["cross"] = "keyword",
|
||||||
|
["normalize"] = "keyword",
|
||||||
|
["ftransform"] = "keyword",
|
||||||
|
["faceforward"] = "keyword",
|
||||||
|
["reflect"] = "keyword",
|
||||||
|
["refract"] = "keyword",
|
||||||
|
["matrixCompMult"] = "keyword",
|
||||||
|
["outerProduct"] = "keyword",
|
||||||
|
["transpose"] = "keyword",
|
||||||
|
["determinant"] = "keyword",
|
||||||
|
["inverse"] = "keyword",
|
||||||
|
["lessThan"] = "keyword",
|
||||||
|
["lessThanEqual"] = "keyword",
|
||||||
|
["greaterThan"] = "keyword",
|
||||||
|
["greaterThanEqual"] = "keyword",
|
||||||
|
["equal"] = "keyword",
|
||||||
|
["notEqual"] = "keyword",
|
||||||
|
["any"] = "keyword",
|
||||||
|
["all"] = "keyword",
|
||||||
|
["not"] = "keyword",
|
||||||
|
["uaddCarry"] = "keyword",
|
||||||
|
["usubBorrow"] = "keyword",
|
||||||
|
["umulExtended"] = "keyword",
|
||||||
|
["imulExtended"] = "keyword",
|
||||||
|
["bitfieldExtract"] = "keyword",
|
||||||
|
["bitfieldInsert"] = "keyword",
|
||||||
|
["bitfieldReverse"] = "keyword",
|
||||||
|
["bitCount"] = "keyword",
|
||||||
|
["findLSB"] = "keyword",
|
||||||
|
["findMSB"] = "keyword",
|
||||||
|
["textureSize"] = "keyword",
|
||||||
|
["textureQueryLod"] = "keyword",
|
||||||
|
["textureQueryLevels"] = "keyword",
|
||||||
|
["textureSamples"] = "keyword",
|
||||||
|
["texture"] = "keyword",
|
||||||
|
["textureProj"] = "keyword",
|
||||||
|
["textureLod"] = "keyword",
|
||||||
|
["textureOffset"] = "keyword",
|
||||||
|
["texelFetch"] = "keyword",
|
||||||
|
["texelFetchOffset"] = "keyword",
|
||||||
|
["textureProjOffset"] = "keyword",
|
||||||
|
["textureLodOffset"] = "keyword",
|
||||||
|
["textureProjLod"] = "keyword",
|
||||||
|
["textureProjLodOffset"] = "keyword",
|
||||||
|
["textureGrad"] = "keyword",
|
||||||
|
["textureGradOffset"] = "keyword",
|
||||||
|
["textureProjGrad"] = "keyword",
|
||||||
|
["textureProjGradOffset"]= "keyword",
|
||||||
|
["textureGather"] = "keyword",
|
||||||
|
["textureGatherOffset"] = "keyword",
|
||||||
|
["textureGatherOffsets"] = "keyword",
|
||||||
|
|
||||||
|
--Atomic Counter Functions
|
||||||
|
["atomicCounterIncrement"]= "keyword",
|
||||||
|
["atomicCounterDecrement"]= "keyword",
|
||||||
|
["atomicCounter"] = "keyword",
|
||||||
|
["atomicCounterAdd"] = "keyword",
|
||||||
|
["atomicCounterSubtract"] = "keyword",
|
||||||
|
["atomicCounterMin"] = "keyword",
|
||||||
|
["atomicCounterMax"] = "keyword",
|
||||||
|
["atomicCounterAnd"] = "keyword",
|
||||||
|
["atomicCounterOr"] = "keyword",
|
||||||
|
["atomicCounterXor"] = "keyword",
|
||||||
|
["atomicCounterExchange"] = "keyword",
|
||||||
|
["atomicCounterCompSwap"] = "keyword",
|
||||||
|
--Atomic Memory Functions
|
||||||
|
["atomicAdd"] = "keyword",
|
||||||
|
["atomicMin"] = "keyword",
|
||||||
|
["atomicMax"] = "keyword",
|
||||||
|
["atomicAnd"] = "keyword",
|
||||||
|
["atomicOr"] = "keyword",
|
||||||
|
["atomicXor"] = "keyword",
|
||||||
|
["atomicExchange"]= "keyword",
|
||||||
|
["atomicCompSwap"]= "keyword",
|
||||||
|
--Image Functions
|
||||||
|
["imageSize"] = "keyword",
|
||||||
|
["imageSamples"] = "keyword",
|
||||||
|
["imageLoad"] = "keyword",
|
||||||
|
["imageStore"] = "keyword",
|
||||||
|
["imageAtomicAdd"] = "keyword",
|
||||||
|
["imageAtomicMin"] = "keyword",
|
||||||
|
["imageAtomicMax"] = "keyword",
|
||||||
|
["imageAtomicAnd"] = "keyword",
|
||||||
|
["imageAtomicOr"] = "keyword",
|
||||||
|
["imageAtomicXor"] = "keyword",
|
||||||
|
["imageAtomicExchange"]= "keyword",
|
||||||
|
["imageAtomicCompSwap"]= "keyword",
|
||||||
|
--Geometry Shader Functions
|
||||||
|
["EmitStreamVertex"] = "keyword",
|
||||||
|
["EndStreamPrimitive"] = "keyword",
|
||||||
|
["EmitVertex"] = "keyword",
|
||||||
|
["EndPrimitive"] = "keyword",
|
||||||
|
--Fragment Processing Functions
|
||||||
|
["dFdx"] = "keyword",
|
||||||
|
["dFdy"] = "keyword",
|
||||||
|
["dFdxFine"] = "keyword",
|
||||||
|
["dFdyFine"] = "keyword",
|
||||||
|
["dFdxCoarse"] = "keyword",
|
||||||
|
["dFdyCoarse"] = "keyword",
|
||||||
|
["fwidth"] = "keyword",
|
||||||
|
["fwidthFine"] = "keyword",
|
||||||
|
["fwidthCoarse"] = "keyword",
|
||||||
|
["interpolateAtCentroid"]= "keyword",
|
||||||
|
["interpolateAtSample"] = "keyword",
|
||||||
|
["interpolateAtOffset"] = "keyword",
|
||||||
|
--Shader Invocation Control Functions
|
||||||
|
["barrier"] = "keyword",
|
||||||
|
--Shader Memory Control Functions
|
||||||
|
["memoryBarrier"] = "keyword",
|
||||||
|
["memoryBarrierAtomicCounter"]= "keyword",
|
||||||
|
["memoryBarrierBuffer"] = "keyword",
|
||||||
|
["memoryBarrierShared"] = "keyword",
|
||||||
|
["memoryBarrierImage"] = "keyword",
|
||||||
|
["groupMemoryBarrier"] = "keyword",
|
||||||
|
--Subpass-Input Functions
|
||||||
|
["subpassLoad"] = "keyword",
|
||||||
|
--Shader Invocation Group Functions
|
||||||
|
["anyInvocation"] = "keyword",
|
||||||
|
["allInvocations"] = "keyword",
|
||||||
|
["allInvocationsEqual"]= "keyword",
|
||||||
|
|
||||||
|
--"In addition, when targeting Vulkan, the following keywords also exist:"
|
||||||
|
["texture1D"] = "keyword",
|
||||||
|
["texture1DArray"] = "keyword",
|
||||||
|
["itexture1D"] = "keyword",
|
||||||
|
["itexture1DArray"] = "keyword",
|
||||||
|
["utexture1D"] = "keyword",
|
||||||
|
["utexture1DArray"] = "keyword",
|
||||||
|
["texture2D"] = "keyword",
|
||||||
|
["texture2DArray"] = "keyword",
|
||||||
|
["itexture2D"] = "keyword",
|
||||||
|
["itexture2DArray"] = "keyword",
|
||||||
|
["utexture2D"] = "keyword",
|
||||||
|
["utexture2DArray"] = "keyword",
|
||||||
|
["texture2DRect"] = "keyword",
|
||||||
|
["itexture2DRect"] = "keyword",
|
||||||
|
["utexture2DRect"] = "keyword",
|
||||||
|
["texture2DMS"] = "keyword",
|
||||||
|
["itexture2DMS"] = "keyword",
|
||||||
|
["utexture2DMS"] = "keyword",
|
||||||
|
["texture2DMSArray"] = "keyword",
|
||||||
|
["itexture2DMSArray"]= "keyword",
|
||||||
|
["utexture2DMSArray"]= "keyword",
|
||||||
|
["texture3D"] = "keyword",
|
||||||
|
["itexture3D"] = "keyword",
|
||||||
|
["utexture3D"] = "keyword",
|
||||||
|
["textureCube"] = "keyword",
|
||||||
|
["itextureCube"] = "keyword",
|
||||||
|
["utextureCube"] = "keyword",
|
||||||
|
["textureCubeArray"] = "keyword",
|
||||||
|
["itextureCubeArray"]= "keyword",
|
||||||
|
["utextureCubeArray"]= "keyword",
|
||||||
|
["textureBuffer"] = "keyword",
|
||||||
|
["itextureBuffer"] = "keyword",
|
||||||
|
["utextureBuffer"] = "keyword",
|
||||||
|
["sampler"] = "keyword2",
|
||||||
|
["samplerShadow"] = "keyword2",
|
||||||
|
["subpassInput"] = "keyword2",
|
||||||
|
["isubpassInput"] = "keyword2",
|
||||||
|
["usubpassInput"] = "keyword2",
|
||||||
|
["subpassInputMS"] = "keyword2",
|
||||||
|
["isubpassInputMS"] = "keyword2",
|
||||||
|
["usubpassInputMS"] = "keyword2",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,274 @@
|
||||||
|
|
||||||
|
local style = require "core.style"
|
||||||
|
local common = require "core.common"
|
||||||
|
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = { "%.hlsl$", },
|
||||||
|
comment = "//",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "//.-\n", type = "comment" },
|
||||||
|
{ pattern = { "/%*", "%*/" }, type = "comment" },
|
||||||
|
{ pattern = { "#", "[^\\]\n" }, type = "comment" },
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "string" },
|
||||||
|
{ pattern = "-?0x%x+", type = "number" },
|
||||||
|
{ pattern = "-?%d+[%d%.eE]*f?", type = "number" },
|
||||||
|
{ pattern = "-?%.?%d+f?", type = "number" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
|
||||||
|
|
||||||
|
{ pattern = "int[1-9]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "int1[0-6]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "int[1-9]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "int1[0-6]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "int[1-4]", type = "keyword2" },
|
||||||
|
|
||||||
|
{ pattern = "uint[1-9]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "uint1[0-6]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "uint[1-9]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "uint1[0-6]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "uint[1-4]", type = "keyword2" },
|
||||||
|
|
||||||
|
{ pattern = "dword[1-9]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "dword1[0-6]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "dword[1-9]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "dword1[0-6]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "dword[1-4]", type = "keyword2" },
|
||||||
|
|
||||||
|
{ pattern = "half[1-9]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "half1[0-6]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "half[1-9]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "half1[0-6]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "half[1-4]", type = "keyword2" },
|
||||||
|
|
||||||
|
{ pattern = "float[1-9]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "float1[0-6]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "float[1-9]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "float1[0-6]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "float[1-4]", type = "keyword2" },
|
||||||
|
|
||||||
|
{ pattern = "double[1-9]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "double1[0-6]x[1-9]", type = "keyword2" },
|
||||||
|
{ pattern = "double[1-9]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "double1[0-6]x1[0-6]", type = "keyword2" },
|
||||||
|
{ pattern = "double[1-4]", type = "keyword2" },
|
||||||
|
|
||||||
|
{ pattern = "[%a_][%w_]*%f[(]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
--https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords
|
||||||
|
--The symbols are added in the order they appear on this webpage, which is alphabetically
|
||||||
|
["AppendStructuredBuffer"]= "keyword",
|
||||||
|
["asm"] = "keyword",
|
||||||
|
["asm_fragment"] = "keyword",
|
||||||
|
["BlendState"] = "keyword2",
|
||||||
|
["bool"] = "keyword2",
|
||||||
|
["break"] = "keyword",
|
||||||
|
["Buffer"] = "keyword2",
|
||||||
|
["ByteAddressBuffer"]= "keyword2",
|
||||||
|
["case"] = "keyword",
|
||||||
|
["cbuffer"] = "keyword2",
|
||||||
|
["centroid"] = "keyword2",
|
||||||
|
["class"] = "keyword",
|
||||||
|
["column_major"] = "keyword",
|
||||||
|
["compile"] = "keyword",
|
||||||
|
["compile_fragment"] = "keyword",
|
||||||
|
["CompileShader"] = "keyword",
|
||||||
|
["const"] = "keyword",
|
||||||
|
["continue"] = "keyword",
|
||||||
|
["ComputeShader"] = "keyword",
|
||||||
|
["ConsumeStructuredBuffer"]= "keyword",
|
||||||
|
["default"] = "keyword",
|
||||||
|
["DepthStencilState"]= "keyword",
|
||||||
|
["DepthStencilView"] = "keyword",
|
||||||
|
["discard"] = "keyword",
|
||||||
|
["do"] = "keyword",
|
||||||
|
["double"] = "keyword2",
|
||||||
|
["DomainShader"] = "keyword2",
|
||||||
|
["dword"] = "keyword2",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["export"] = "keyword",
|
||||||
|
["extern"] = "keyword",
|
||||||
|
["false"] = "literal",
|
||||||
|
["float"] = "keyword2",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["fxgroup"] = "keyword2",
|
||||||
|
["GeometryShader"] = "keyword2",
|
||||||
|
["groupshared"] = "keyword",
|
||||||
|
["half"] = "keyword2",
|
||||||
|
["HullShader"] = "keyword2",
|
||||||
|
["if"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["inline"] = "keyword",
|
||||||
|
["inout"] = "keyword",
|
||||||
|
["InputPatch"] = "keyword2",
|
||||||
|
["int"] = "keyword2",
|
||||||
|
["interface"] = "keyword",
|
||||||
|
["line"] = "keyword2",
|
||||||
|
["lineadj"] = "keyword2",
|
||||||
|
["linear"] = "keyword",
|
||||||
|
["LineStream"] = "keyword2",
|
||||||
|
["matrix"] = "keyword2",
|
||||||
|
["min16float"] = "keyword2",
|
||||||
|
["min10float"] = "keyword2",
|
||||||
|
["min16int"] = "keyword2",
|
||||||
|
["min12int"] = "keyword2",
|
||||||
|
["min16uint"] = "keyword2",
|
||||||
|
["namespace"] = "keyword",
|
||||||
|
["nointerpolation"] = "keyword",
|
||||||
|
["noperspective"] = "keyword",
|
||||||
|
["NULL"] = "literal",
|
||||||
|
["out"] = "keyword",
|
||||||
|
["OutputPatch"] = "keyword2",
|
||||||
|
["packoffset"] = "keyword",
|
||||||
|
["pass"] = "keyword",
|
||||||
|
["pixelfragment"] = "keyword",
|
||||||
|
["PixelShader"] = "keyword2",
|
||||||
|
["point"] = "keyword2",
|
||||||
|
["PointStream"] = "keyword2",
|
||||||
|
["precise"] = "keyword",
|
||||||
|
["RasterizerState"] = "keyword2",
|
||||||
|
["RenderTargetView"] = "keyword2",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["register"] = "keyword",
|
||||||
|
["row_major"] = "keyword",
|
||||||
|
["RWBuffer"] = "keyword2",
|
||||||
|
["RWByteAddressBuffer"]= "keyword2",
|
||||||
|
["RWStructuredBuffer"]= "keyword2",
|
||||||
|
["RWTexture1D"] = "keyword2",
|
||||||
|
["RWTexture1DArray"] = "keyword2",
|
||||||
|
["RWTexture2D"] = "keyword2",
|
||||||
|
["RWTexture2DArray"] = "keyword2",
|
||||||
|
["RWTexture3D"] = "keyword2",
|
||||||
|
["sample"] = "keyword",
|
||||||
|
["sampler"] = "keyword2",
|
||||||
|
["SamplerState"] = "keyword2",
|
||||||
|
["SamplerComparisonState"]= "keyword2",
|
||||||
|
["shared"] = "keyword",
|
||||||
|
["snorm"] = "keyword",
|
||||||
|
["stateblock"] = "keyword",
|
||||||
|
["stateblock_state"] = "keyword",
|
||||||
|
["static"] = "keyword",
|
||||||
|
["string"] = "keyword2",
|
||||||
|
["struct"] = "keyword",
|
||||||
|
["switch"] = "keyword",
|
||||||
|
["StructuredBuffer"] = "keyword2",
|
||||||
|
["tbuffer"] = "keyword2",
|
||||||
|
["technique"] = "keyword2",
|
||||||
|
["technique10"] = "keyword2",
|
||||||
|
["technique11"] = "keyword2",
|
||||||
|
["texture"] = "keyword2",
|
||||||
|
["Texture1D"] = "keyword2",
|
||||||
|
["Texture1DArray"] = "keyword2",
|
||||||
|
["Texture2D"] = "keyword2",
|
||||||
|
["Texture2DArray"] = "keyword2",
|
||||||
|
["Texture2DMS"] = "keyword2",
|
||||||
|
["Texture2DMSArray"] = "keyword2",
|
||||||
|
["Texture3D"] = "keyword2",
|
||||||
|
["TextureCube"] = "keyword2",
|
||||||
|
["TextureCubeArray"] = "keyword2",
|
||||||
|
["true"] = "literal",
|
||||||
|
["typedef"] = "keyword",
|
||||||
|
["triangle"] = "keyword2",
|
||||||
|
["triangleadj"] = "keyword2",
|
||||||
|
["TriangleStream"] = "keyword2",
|
||||||
|
["uint"] = "keyword2",
|
||||||
|
["uniform"] = "keyword",
|
||||||
|
["unorm"] = "keyword",
|
||||||
|
["unsigned"] = "keyword",
|
||||||
|
["vector"] = "keyword2",
|
||||||
|
["vertexfragment"] = "keyword2",
|
||||||
|
["VertexShader"] = "keyword2",
|
||||||
|
["void"] = "keyword",
|
||||||
|
["volatile"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
|
||||||
|
--https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions
|
||||||
|
--The symbols are added in the order they appear on this webpage, which is alphabetically
|
||||||
|
["abort"] = "keyword",
|
||||||
|
["abs"] = "keyword",
|
||||||
|
["acos"] = "keyword",
|
||||||
|
["all"] = "keyword",
|
||||||
|
["any"] = "keyword",
|
||||||
|
["asdouble"] = "keyword",
|
||||||
|
["asfloat"] = "keyword",
|
||||||
|
["asin"] = "keyword",
|
||||||
|
["asint"] = "keyword",
|
||||||
|
["asuint"] = "keyword",
|
||||||
|
["atan"] = "keyword",
|
||||||
|
["atan2"] = "keyword",
|
||||||
|
["ceil"] = "keyword",
|
||||||
|
["clamp"] = "keyword",
|
||||||
|
["clip"] = "keyword",
|
||||||
|
["cos"] = "keyword",
|
||||||
|
["cosh"] = "keyword",
|
||||||
|
["countbits"] = "keyword",
|
||||||
|
["cross"] = "keyword",
|
||||||
|
["ddx"] = "keyword",
|
||||||
|
["ddx_coarse"] = "keyword",
|
||||||
|
["ddx_fine"] = "keyword",
|
||||||
|
["ddy"] = "keyword",
|
||||||
|
["ddy_coarse"] = "keyword",
|
||||||
|
["ddy_fine"] = "keyword",
|
||||||
|
["degrees"] = "keyword",
|
||||||
|
["determinant"] = "keyword",
|
||||||
|
["distance"] = "keyword",
|
||||||
|
["dot"] = "keyword",
|
||||||
|
["dst"] = "keyword",
|
||||||
|
["errorf"] = "keyword",
|
||||||
|
["exp"] = "keyword",
|
||||||
|
["exp2"] = "keyword",
|
||||||
|
["f16tof32"] = "keyword",
|
||||||
|
["f32tof16"] = "keyword",
|
||||||
|
["faceforward"] = "keyword",
|
||||||
|
["firstbithigh"]= "keyword",
|
||||||
|
["firstbitlow"] = "keyword",
|
||||||
|
["floor"] = "keyword",
|
||||||
|
["fma"] = "keyword",
|
||||||
|
["fmod"] = "keyword",
|
||||||
|
["frac"] = "keyword",
|
||||||
|
["frexp"] = "keyword",
|
||||||
|
["fwidth"] = "keyword",
|
||||||
|
["isfinite"] = "keyword",
|
||||||
|
["isinf"] = "keyword",
|
||||||
|
["isnan"] = "keyword",
|
||||||
|
["ldexp"] = "keyword",
|
||||||
|
["length"] = "keyword",
|
||||||
|
["lerp"] = "keyword",
|
||||||
|
["lit"] = "keyword",
|
||||||
|
["log"] = "keyword",
|
||||||
|
["log10"] = "keyword",
|
||||||
|
["log2"] = "keyword",
|
||||||
|
["mad"] = "keyword",
|
||||||
|
["max"] = "keyword",
|
||||||
|
["min"] = "keyword",
|
||||||
|
["modf"] = "keyword",
|
||||||
|
["msad4"] = "keyword",
|
||||||
|
["mul"] = "keyword",
|
||||||
|
["noise"] = "keyword",
|
||||||
|
["normalize"] = "keyword",
|
||||||
|
["pow"] = "keyword",
|
||||||
|
["printf"] = "keyword",
|
||||||
|
["radians"] = "keyword",
|
||||||
|
["rcp"] = "keyword",
|
||||||
|
["reflect"] = "keyword",
|
||||||
|
["refract"] = "keyword",
|
||||||
|
["reversebits"] = "keyword",
|
||||||
|
["round"] = "keyword",
|
||||||
|
["rsqrt"] = "keyword",
|
||||||
|
["saturate"] = "keyword",
|
||||||
|
["sign"] = "keyword",
|
||||||
|
["sin"] = "keyword",
|
||||||
|
["sincos"] = "keyword",
|
||||||
|
["sinh"] = "keyword",
|
||||||
|
["smoothstep"] = "keyword",
|
||||||
|
["sqrt"] = "keyword",
|
||||||
|
["step"] = "keyword",
|
||||||
|
["tan"] = "keyword",
|
||||||
|
["tanh"] = "keyword",
|
||||||
|
["transpose"] = "keyword",
|
||||||
|
["trunc"] = "keyword",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = "%.moon$",
|
||||||
|
headers = "^#!.*[ /]moon",
|
||||||
|
comment = "--",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "string" },
|
||||||
|
{ pattern = { "%[%[", "%]%]" }, type = "string" },
|
||||||
|
{ pattern = "%-%-.-\n", type = "comment" },
|
||||||
|
{ pattern = "-?0x%x+", type = "number" },
|
||||||
|
{ pattern = "-?%d+[%d%.eE]*", type = "number" },
|
||||||
|
{ pattern = "-?%.?%d+", type = "number" },
|
||||||
|
{ pattern = "%.%.%.?", type = "keyword2" },
|
||||||
|
{ pattern = "[<>~=]=", type = "keyword2" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%#<>]", type = "keyword2" },
|
||||||
|
{ pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
{ pattern = {"\\", "[%a_][%w_]*"}, type = "function" },
|
||||||
|
{ pattern = {"%.", "[%a_][%w_]*"}, type = "function" },
|
||||||
|
{ pattern = {"@", "[%a_][%w_]*"}, type = "keyword2" },
|
||||||
|
{ pattern = "!", type = "keyword2" },
|
||||||
|
{ pattern = "[%p]", type = "keyword" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
["if"] = "keyword",
|
||||||
|
["then"] = "keyword",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["when"] = "keyword",
|
||||||
|
["elseif"] = "keyword",
|
||||||
|
["do"] = "keyword",
|
||||||
|
["->"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["break"] = "keyword",
|
||||||
|
["continue"] = "keyword",
|
||||||
|
["export"] = "keyword",
|
||||||
|
["unless"] = "keyword",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["not"] = "keyword",
|
||||||
|
["and"] = "keyword",
|
||||||
|
["or"] = "keyword",
|
||||||
|
["import"] = "keyword",
|
||||||
|
["as"] = "keyword",
|
||||||
|
["from"] = "keyword",
|
||||||
|
["class"] = "keyword",
|
||||||
|
["extends"] = "keyword",
|
||||||
|
["switch"] = "keyword",
|
||||||
|
["with"] = "keyword",
|
||||||
|
["using"] = "keyword",
|
||||||
|
["super"] = "keyword2",
|
||||||
|
["self"] = "keyword2",
|
||||||
|
["#"] = "keyword2",
|
||||||
|
["true"] = "literal",
|
||||||
|
["false"] = "literal",
|
||||||
|
["nil"] = "literal",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,120 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
local patterns = {}
|
||||||
|
|
||||||
|
local symbols = {
|
||||||
|
["nil"] = "literal",
|
||||||
|
["true"] = "literal",
|
||||||
|
["false"] = "literal",
|
||||||
|
}
|
||||||
|
|
||||||
|
local number_patterns = {
|
||||||
|
"0[bB][01][01_]*",
|
||||||
|
"0o[0-7][0-7_]*",
|
||||||
|
"0[xX]%x[%x_]*",
|
||||||
|
"%d[%d_]*%.%d[%d_]*[eE][-+]?%d[%d_]*",
|
||||||
|
"%d[%d_]*%.%d[%d_]*",
|
||||||
|
"%d[%d_]*",
|
||||||
|
}
|
||||||
|
|
||||||
|
local type_suffix_patterns = {}
|
||||||
|
|
||||||
|
for _, size in ipairs({"", "8", "16", "32", "64"}) do
|
||||||
|
table.insert(type_suffix_patterns, "'?[fuiFUI]"..size)
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, pattern in ipairs(number_patterns) do
|
||||||
|
for _, suffix in ipairs(type_suffix_patterns) do
|
||||||
|
table.insert(patterns, { pattern = pattern..suffix, type = "literal" })
|
||||||
|
end
|
||||||
|
table.insert(patterns, { pattern = pattern, type = "literal" })
|
||||||
|
end
|
||||||
|
|
||||||
|
local keywords = {
|
||||||
|
"addr", "and", "as", "asm",
|
||||||
|
"bind", "block", "break",
|
||||||
|
"case", "cast", "concept", "const", "continue", "converter",
|
||||||
|
"defer", "discard", "distinct", "div", "do",
|
||||||
|
"elif", "else", "end", "enum", "except", "export",
|
||||||
|
"finally", "for", "from", "func",
|
||||||
|
"if", "import", "in", "include", "interface", "is", "isnot", "iterator",
|
||||||
|
"let",
|
||||||
|
"macro", "method", "mixin", "mod",
|
||||||
|
"not", "notin",
|
||||||
|
"object", "of", "or", "out",
|
||||||
|
"proc", "ptr",
|
||||||
|
"raise", "ref", "return",
|
||||||
|
"shl", "shr", "static",
|
||||||
|
"template", "try", "tuple", "type",
|
||||||
|
"using",
|
||||||
|
"var",
|
||||||
|
"when", "while",
|
||||||
|
"xor",
|
||||||
|
"yield",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, keyword in ipairs(keywords) do
|
||||||
|
symbols[keyword] = "keyword"
|
||||||
|
end
|
||||||
|
|
||||||
|
local standard_types = {
|
||||||
|
"bool", "byte",
|
||||||
|
"int", "int8", "int16", "int32", "int64",
|
||||||
|
"uint", "uint8", "uint16", "uint32", "uint64",
|
||||||
|
"float", "float32", "float64",
|
||||||
|
"char", "string", "cstring",
|
||||||
|
"pointer",
|
||||||
|
"typedesc",
|
||||||
|
"void", "auto", "any",
|
||||||
|
"untyped", "typed",
|
||||||
|
"clong", "culong", "cchar", "cschar", "cshort", "cint", "csize", "csize_t",
|
||||||
|
"clonglong", "cfloat", "cdouble", "clongdouble", "cuchar", "cushort",
|
||||||
|
"cuint", "culonglong", "cstringArray",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, type in ipairs(standard_types) do
|
||||||
|
symbols[type] = "keyword2"
|
||||||
|
end
|
||||||
|
|
||||||
|
local standard_generic_types = {
|
||||||
|
"range",
|
||||||
|
"array", "open[aA]rray", "varargs", "seq", "set",
|
||||||
|
"sink", "lent", "owned",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, type in ipairs(standard_generic_types) do
|
||||||
|
table.insert(patterns, { pattern = type.."%f[%[]", type = "keyword2" })
|
||||||
|
table.insert(patterns, { pattern = type.." +%f[%w]", type = "keyword2" })
|
||||||
|
end
|
||||||
|
|
||||||
|
local user_patterns = {
|
||||||
|
-- comments
|
||||||
|
{ pattern = { "##?%[", "]##?" }, type = "comment" },
|
||||||
|
{ pattern = "##?.-\n", type = "comment" },
|
||||||
|
-- strings and chars
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { '"""', '"""[^"]' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "literal" },
|
||||||
|
-- function calls
|
||||||
|
{ pattern = "[a-zA-Z][a-zA-Z0-9_]*%f[(]", type = "function" },
|
||||||
|
-- identifiers
|
||||||
|
{ pattern = "[A-Z][a-zA-Z0-9_]*", type = "keyword2" },
|
||||||
|
{ pattern = "[a-zA-Z][a-zA-Z0-9_]*", type = "symbol" },
|
||||||
|
-- operators
|
||||||
|
{ pattern = "%.%f[^.]", type = "normal" },
|
||||||
|
{ pattern = ":%f[ ]", type = "normal" },
|
||||||
|
{ pattern = "[=+%-*/<>@$~&%%|!?%^&.:\\]+", type = "operator" },
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pattern in ipairs(user_patterns) do
|
||||||
|
table.insert(patterns, pattern)
|
||||||
|
end
|
||||||
|
|
||||||
|
local nim = {
|
||||||
|
files = { "%.nim$", "%.nims$", "%.nimble$" },
|
||||||
|
comment = "#",
|
||||||
|
patterns = patterns,
|
||||||
|
symbols = symbols,
|
||||||
|
}
|
||||||
|
|
||||||
|
syntax.add(nim)
|
|
@ -0,0 +1,43 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = { "%.wren$" },
|
||||||
|
comment = "//",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "//.-\n", type = "comment" },
|
||||||
|
{ pattern = { "/%*", "%*/" }, type = "comment" },
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "string" },
|
||||||
|
{ pattern = "-?%.?%d+", type = "number" },
|
||||||
|
{ pattern = "%.%.%.?", type = "operator" },
|
||||||
|
{ pattern = "[<>!=]=", type = "operator" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%<>!~|&?:]", type = "operator" },
|
||||||
|
{ pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
["break"] = "keyword",
|
||||||
|
["class"] = "keyword",
|
||||||
|
["construct"] = "keyword",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["false"] = "keyword",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["foreign"] = "keyword",
|
||||||
|
["if"] = "keyword",
|
||||||
|
["import"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["is"] = "keyword",
|
||||||
|
["null"] = "keyword",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["static"] = "keyword",
|
||||||
|
["super"] = "keyword",
|
||||||
|
["this"] = "keyword",
|
||||||
|
["true"] = "keyword",
|
||||||
|
["var"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
["this"] = "keyword2",
|
||||||
|
["true"] = "literal",
|
||||||
|
["false"] = "literal",
|
||||||
|
["null"] = "literal",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = {"%.tl$","%.d.tl$"},
|
||||||
|
comment = "--",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "string" },
|
||||||
|
{ pattern = { "%[%[", "%]%]" }, type = "string" },
|
||||||
|
{ pattern = { "%-%-%[%[", "%]%]"}, type = "comment" },
|
||||||
|
{ pattern = "%-%-.-\n", type = "comment" },
|
||||||
|
{ pattern = "-?0x%x+", type = "number" },
|
||||||
|
{ pattern = "-?%d+[%d%.eE]*", type = "number" },
|
||||||
|
{ pattern = "-?%.?%d+", type = "number" },
|
||||||
|
{ pattern = "<%a+>", type = "keyword2" },
|
||||||
|
{ pattern = "%.%.%.?", type = "operator" },
|
||||||
|
{ pattern = "[<>~=]=", type = "operator" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%#<>]", type = "operator" },
|
||||||
|
{ pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
{ pattern = "::[%a_][%w_]*::", type = "function" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
["if"] = "keyword",
|
||||||
|
["then"] = "keyword",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["elseif"] = "keyword",
|
||||||
|
["end"] = "keyword",
|
||||||
|
["do"] = "keyword",
|
||||||
|
["function"] = "keyword",
|
||||||
|
["repeat"] = "keyword",
|
||||||
|
["until"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["break"] = "keyword",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["local"] = "keyword",
|
||||||
|
["global"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["not"] = "keyword",
|
||||||
|
["and"] = "keyword",
|
||||||
|
["or"] = "keyword",
|
||||||
|
["goto"] = "keyword",
|
||||||
|
["enum"] = "keyword",
|
||||||
|
["record"] = "keyword",
|
||||||
|
["any"] = "keyword2",
|
||||||
|
["boolean"] = "keyword2",
|
||||||
|
["number"] = "keyword2",
|
||||||
|
["string"] = "keyword2",
|
||||||
|
["thread"] = "keyword2",
|
||||||
|
["true"] = "literal",
|
||||||
|
["false"] = "literal",
|
||||||
|
["nil"] = "literal",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = { "%.ts$", "%.d.ts$", "%.tsx$"},
|
||||||
|
comment = "//",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "//.-\n", type = "comment" },
|
||||||
|
{ pattern = { "/%*", "%*/" }, type = "comment" },
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "string" },
|
||||||
|
{ pattern = { "`", "`", '\\' }, type = "string" },
|
||||||
|
{ pattern = "0x[%da-fA-F]+", type = "number" },
|
||||||
|
{ pattern = "-?%d+[%d%.eE]*", type = "number" },
|
||||||
|
{ pattern = "-?%.?%d+", type = "number" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
|
||||||
|
{ pattern = "[%a_][%w_]*%f[(]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
["any"] = "keyword2",
|
||||||
|
["arguments"] = "keyword2",
|
||||||
|
["as"] = "keyword2",
|
||||||
|
["async"] = "keyword",
|
||||||
|
["await"] = "keyword",
|
||||||
|
["boolean"] = "keyword2",
|
||||||
|
["break"] = "keyword",
|
||||||
|
["case"] = "keyword",
|
||||||
|
["catch"] = "keyword",
|
||||||
|
["class"] = "keyword",
|
||||||
|
["const"] = "keyword",
|
||||||
|
["constructor"]= "keyword2",
|
||||||
|
["continue"] = "keyword",
|
||||||
|
["debugger"] = "keyword",
|
||||||
|
["declare"] = "keyword2",
|
||||||
|
["default"] = "keyword",
|
||||||
|
["delete"] = "keyword",
|
||||||
|
["do"] = "keyword",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["enum"] = "keyword2",
|
||||||
|
["export"] = "keyword",
|
||||||
|
["extends"] = "keyword",
|
||||||
|
["false"] = "literal",
|
||||||
|
["finally"] = "keyword",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["from"] = "keyword",
|
||||||
|
["function"] = "keyword",
|
||||||
|
["get"] = "keyword",
|
||||||
|
["if"] = "keyword",
|
||||||
|
["implements"] = "keyword2",
|
||||||
|
["import"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["Infinity"] = "keyword2",
|
||||||
|
["instanceof"] = "keyword",
|
||||||
|
["interface"] = "keyword2",
|
||||||
|
["let"] = "keyword",
|
||||||
|
["module"] = "keyword2",
|
||||||
|
["new"] = "keyword",
|
||||||
|
["null"] = "literal",
|
||||||
|
["number"] = "keyword2",
|
||||||
|
["of"] = "keyword2",
|
||||||
|
["package"] = "keyword2",
|
||||||
|
["private"] = "keyword2",
|
||||||
|
["protected"] = "keyword2",
|
||||||
|
["public"] = "keyword2",
|
||||||
|
["require"] = "keyword2",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["set"] = "keyword",
|
||||||
|
["static"] = "keyword",
|
||||||
|
["string"] = "keyword2",
|
||||||
|
["super"] = "keyword",
|
||||||
|
["switch"] = "keyword",
|
||||||
|
["symbol"] = "keyword2",
|
||||||
|
["this"] = "keyword2",
|
||||||
|
["throw"] = "keyword",
|
||||||
|
["true"] = "literal",
|
||||||
|
["try"] = "keyword",
|
||||||
|
["type"] = "keyword2",
|
||||||
|
["typeof"] = "keyword",
|
||||||
|
["undefined"] = "literal",
|
||||||
|
["var"] = "keyword",
|
||||||
|
["void"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
["with"] = "keyword",
|
||||||
|
["yield"] = "keyword",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
local syntax = require "core.syntax"
|
||||||
|
|
||||||
|
syntax.add {
|
||||||
|
files = { "%.wren$" },
|
||||||
|
comment = "//",
|
||||||
|
patterns = {
|
||||||
|
{ pattern = "//.-\n", type = "comment" },
|
||||||
|
{ pattern = { "/%*", "%*/" }, type = "comment" },
|
||||||
|
{ pattern = { '"', '"', '\\' }, type = "string" },
|
||||||
|
{ pattern = { "'", "'", '\\' }, type = "string" },
|
||||||
|
{ pattern = "-?%.?%d+", type = "number" },
|
||||||
|
{ pattern = "%.%.%.?", type = "operator" },
|
||||||
|
{ pattern = "[<>!=]=", type = "operator" },
|
||||||
|
{ pattern = "[%+%-=/%*%^%%<>!~|&?:]", type = "operator" },
|
||||||
|
{ pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" },
|
||||||
|
{ pattern = "[%a_][%w_]*", type = "symbol" },
|
||||||
|
},
|
||||||
|
symbols = {
|
||||||
|
["break"] = "keyword",
|
||||||
|
["class"] = "keyword",
|
||||||
|
["construct"] = "keyword",
|
||||||
|
["else"] = "keyword",
|
||||||
|
["false"] = "keyword",
|
||||||
|
["for"] = "keyword",
|
||||||
|
["foreign"] = "keyword",
|
||||||
|
["if"] = "keyword",
|
||||||
|
["import"] = "keyword",
|
||||||
|
["in"] = "keyword",
|
||||||
|
["is"] = "keyword",
|
||||||
|
["null"] = "keyword",
|
||||||
|
["return"] = "keyword",
|
||||||
|
["static"] = "keyword",
|
||||||
|
["super"] = "keyword",
|
||||||
|
["this"] = "keyword",
|
||||||
|
["true"] = "keyword",
|
||||||
|
["var"] = "keyword",
|
||||||
|
["while"] = "keyword",
|
||||||
|
["this"] = "keyword2",
|
||||||
|
["true"] = "literal",
|
||||||
|
["false"] = "literal",
|
||||||
|
["null"] = "literal",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
-- CloseConfirmX plugin for lite text editor
|
||||||
|
-- implementation by chekoopa
|
||||||
|
|
||||||
|
local core = require "core"
|
||||||
|
local config = require "core.config"
|
||||||
|
|
||||||
|
config.closeconfirmx_use_legacy = false
|
||||||
|
config.closeconfirmx_use_short_name = true
|
||||||
|
|
||||||
|
local legacy_confirm = core.confirm_close_all
|
||||||
|
|
||||||
|
local function commandful_confirm()
|
||||||
|
local dirty_count = 0
|
||||||
|
local dirty_name
|
||||||
|
for _, doc in ipairs(core.docs) do
|
||||||
|
if doc:is_dirty() then
|
||||||
|
dirty_count = dirty_count + 1
|
||||||
|
dirty_name = doc:get_name()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if dirty_count > 0 then
|
||||||
|
local text
|
||||||
|
if dirty_count == 1 then
|
||||||
|
if config.closeconfirmx_use_short_name then
|
||||||
|
dirty_name = dirty_name:match("[^/%\\]*$")
|
||||||
|
end
|
||||||
|
text = string.format("Unsaved changes in \"%s\"; Confirm Exit", dirty_name)
|
||||||
|
else
|
||||||
|
text = string.format("Unsaved changes in %d docs; Confirm Exit", dirty_count)
|
||||||
|
end
|
||||||
|
core.command_view:enter(text, function(_, item)
|
||||||
|
if item.text:match("^[cC]") then
|
||||||
|
core.quit(true)
|
||||||
|
end
|
||||||
|
end, function(text)
|
||||||
|
local items = {}
|
||||||
|
if not text:find("^[^sS]") then table.insert(items, "Stay here") end
|
||||||
|
if not text:find("^[^cC]") then table.insert(items, "Close Without Saving") end
|
||||||
|
return items
|
||||||
|
end)
|
||||||
|
-- as we delegate a choice inside the callback,
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function core.confirm_close_all()
|
||||||
|
if config.closeconfirmx_use_legacy then
|
||||||
|
return legacy_confirm()
|
||||||
|
else
|
||||||
|
return commandful_confirm()
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,54 @@
|
||||||
|
local common = require "core.common"
|
||||||
|
local DocView = require "core.docview"
|
||||||
|
|
||||||
|
|
||||||
|
local white = { common.color "#ffffff" }
|
||||||
|
local black = { common.color "#000000" }
|
||||||
|
local tmp = {}
|
||||||
|
|
||||||
|
|
||||||
|
local function draw_color_previews(self, idx, x, y, ptn, base, nibbles)
|
||||||
|
local text = self.doc.lines[idx]
|
||||||
|
local s, e = 0, 0
|
||||||
|
|
||||||
|
while true do
|
||||||
|
s, e = text:find(ptn, e + 1)
|
||||||
|
if not s then break end
|
||||||
|
|
||||||
|
local str = text:sub(s, e)
|
||||||
|
local r, g, b = str:match(ptn)
|
||||||
|
r, g, b = tonumber(r, base), tonumber(g, base), tonumber(b, base)
|
||||||
|
|
||||||
|
-- #123 becomes #112233
|
||||||
|
if nibbles then
|
||||||
|
r = r * 16
|
||||||
|
g = g * 16
|
||||||
|
b = b * 16
|
||||||
|
end
|
||||||
|
|
||||||
|
local x1 = x + self:get_col_x_offset(idx, s)
|
||||||
|
local x2 = x + self:get_col_x_offset(idx, e + 1)
|
||||||
|
local oy = self:get_line_text_y_offset()
|
||||||
|
|
||||||
|
local text_color = math.max(r, g, b) < 128 and white or black
|
||||||
|
tmp[1], tmp[2], tmp[3] = r, g, b
|
||||||
|
|
||||||
|
local l1, _, l2, _ = self.doc:get_selection(true)
|
||||||
|
|
||||||
|
if not (self.doc:has_selection() and idx >= l1 and idx <= l2) then
|
||||||
|
renderer.draw_rect(x1, y, x2 - x1, self:get_line_height(), tmp)
|
||||||
|
renderer.draw_text(self:get_font(), str, x1, y + oy, text_color)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local draw_line_text = DocView.draw_line_text
|
||||||
|
|
||||||
|
function DocView:draw_line_text(idx, x, y)
|
||||||
|
draw_line_text(self, idx, x, y)
|
||||||
|
draw_color_previews(self, idx, x, y, "#(%x%x)(%x%x)(%x%x)%f[%W]", 16)
|
||||||
|
draw_color_previews(self, idx, x, y, "#(%x)(%x)(%x)%f[%W]", 16, true) -- support #fff css format
|
||||||
|
draw_color_previews(self, idx, x, y, "rgb?%((%d+)%D+(%d+)%D+(%d+).-%)", 10)
|
||||||
|
draw_color_previews(self, idx, x, y, "rgba?%((%d+)%D+(%d+)%D+(%d+).-%)", 10)
|
||||||
|
end
|
|
@ -0,0 +1,68 @@
|
||||||
|
local core = require "core"
|
||||||
|
local config = require "core.config"
|
||||||
|
local style = require "core.style"
|
||||||
|
local StatusView = require "core.statusview"
|
||||||
|
|
||||||
|
|
||||||
|
local git = {
|
||||||
|
branch = nil,
|
||||||
|
inserts = 0,
|
||||||
|
deletes = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
local function exec(cmd, wait)
|
||||||
|
local tempfile = core.temp_filename()
|
||||||
|
system.exec(string.format("%s > %q", cmd, tempfile))
|
||||||
|
coroutine.yield(wait)
|
||||||
|
local fp = io.open(tempfile)
|
||||||
|
local res = fp:read("*a")
|
||||||
|
fp:close()
|
||||||
|
os.remove(tempfile)
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
core.add_thread(function()
|
||||||
|
while true do
|
||||||
|
if system.get_file_info(".git") then
|
||||||
|
-- get branch name
|
||||||
|
git.branch = exec("git rev-parse --abbrev-ref HEAD", 1):match("[^\n]*")
|
||||||
|
|
||||||
|
-- get diff
|
||||||
|
local line = exec("git diff --stat", 1):match("[^\n]*%s*$")
|
||||||
|
git.inserts = tonumber(line:match("(%d+) ins")) or 0
|
||||||
|
git.deletes = tonumber(line:match("(%d+) del")) or 0
|
||||||
|
|
||||||
|
else
|
||||||
|
git.branch = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
coroutine.yield(config.project_scan_rate)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
local get_items = StatusView.get_items
|
||||||
|
|
||||||
|
function StatusView:get_items()
|
||||||
|
if not git.branch then
|
||||||
|
return get_items(self)
|
||||||
|
end
|
||||||
|
local left, right = get_items(self)
|
||||||
|
|
||||||
|
local t = {
|
||||||
|
style.dim, self.separator,
|
||||||
|
(git.inserts ~= 0 or git.deletes ~= 0) and style.accent or style.text,
|
||||||
|
git.branch,
|
||||||
|
style.dim, " ",
|
||||||
|
git.inserts ~= 0 and style.accent or style.text, "+", git.inserts,
|
||||||
|
style.dim, " / ",
|
||||||
|
git.deletes ~= 0 and style.accent or style.text, "-", git.deletes,
|
||||||
|
}
|
||||||
|
for _, item in ipairs(t) do
|
||||||
|
table.insert(right, item)
|
||||||
|
end
|
||||||
|
|
||||||
|
return left, right
|
||||||
|
end
|
|
@ -0,0 +1,64 @@
|
||||||
|
local core = require "core"
|
||||||
|
local command = require "core.command"
|
||||||
|
local config = require "core.config"
|
||||||
|
local keymap = require "core.keymap"
|
||||||
|
|
||||||
|
config.lfautoinsert_map = {
|
||||||
|
["{%s*\n"] = "}",
|
||||||
|
["%(%s*\n"] = ")",
|
||||||
|
["%f[[]%[%s*\n"] = "]",
|
||||||
|
["%[%[%s*\n"] = "]]",
|
||||||
|
["=%s*\n"] = false,
|
||||||
|
[":%s*\n"] = false,
|
||||||
|
["^#if.*\n"] = "#endif",
|
||||||
|
["^#else.*\n"] = "#endif",
|
||||||
|
["%f[%w]do%s*\n"] = "end",
|
||||||
|
["%f[%w]then%s*\n"] = "end",
|
||||||
|
["%f[%w]else%s*\n"] = "end",
|
||||||
|
["%f[%w]repeat%s*\n"] = "until",
|
||||||
|
["%f[%w]function.*%)%s*\n"] = "end",
|
||||||
|
["^%s*<([^/][^%s>]*)[^>]*>%s*\n"] = "</$TEXT>",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
local function indent_size(doc, line)
|
||||||
|
local text = doc.lines[line] or ""
|
||||||
|
local s, e = text:find("^[\t ]*")
|
||||||
|
return e - s
|
||||||
|
end
|
||||||
|
|
||||||
|
command.add("core.docview", {
|
||||||
|
["autoinsert:newline"] = function()
|
||||||
|
command.perform("doc:newline")
|
||||||
|
|
||||||
|
local doc = core.active_view.doc
|
||||||
|
local line, col = doc:get_selection()
|
||||||
|
local text = doc.lines[line - 1]
|
||||||
|
|
||||||
|
for ptn, close in pairs(config.lfautoinsert_map) do
|
||||||
|
local s, _, str = text:find(ptn)
|
||||||
|
if s then
|
||||||
|
if close
|
||||||
|
and col == #doc.lines[line]
|
||||||
|
and indent_size(doc, line + 1) <= indent_size(doc, line - 1)
|
||||||
|
then
|
||||||
|
close = str and close:gsub("$TEXT", str) or close
|
||||||
|
command.perform("doc:newline")
|
||||||
|
core.active_view:on_text_input(close)
|
||||||
|
command.perform("doc:move-to-previous-line")
|
||||||
|
if doc.lines[line+1] == doc.lines[line+2] then
|
||||||
|
doc:remove(line+1, 1, line+2, 1)
|
||||||
|
end
|
||||||
|
elseif col < #doc.lines[line] then
|
||||||
|
command.perform("doc:newline")
|
||||||
|
command.perform("doc:move-to-previous-line")
|
||||||
|
end
|
||||||
|
command.perform("doc:indent")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
keymap.add {
|
||||||
|
["return"] = { "command:submit", "autoinsert:newline" }
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
local core = require "core"
|
||||||
|
local command = require "core.command"
|
||||||
|
local config = require "core.config"
|
||||||
|
|
||||||
|
|
||||||
|
if PLATFORM == "Windows" then
|
||||||
|
config.filemanager = "explorer"
|
||||||
|
elseif PLATFORM == "Mac OS X" then
|
||||||
|
config.filemanager = "open"
|
||||||
|
else
|
||||||
|
config.filemanager = "xdg-open"
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
command.add("core.docview", {
|
||||||
|
["open-file-location:open-file-location"] = function()
|
||||||
|
local doc = core.active_view.doc
|
||||||
|
if not doc.filename then
|
||||||
|
core.error "Cannot open location of unsaved doc"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local folder = doc.filename:match("^(.*)[/\\].*$") or "."
|
||||||
|
core.log("Opening \"%s\"", folder)
|
||||||
|
if PLATFORM == "Windows" then
|
||||||
|
system.exec(string.format("%s %s", config.filemanager, folder))
|
||||||
|
else
|
||||||
|
system.exec(string.format("%s %q", config.filemanager, folder))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
|
@ -0,0 +1,58 @@
|
||||||
|
local tokenizer = require "core.tokenizer"
|
||||||
|
local style = require "core.style"
|
||||||
|
local common = require "core.common"
|
||||||
|
|
||||||
|
local tokenize = tokenizer.tokenize
|
||||||
|
local closers = {
|
||||||
|
["("] = ")",
|
||||||
|
["["] = "]",
|
||||||
|
["{"] = "}"
|
||||||
|
}
|
||||||
|
local function parenstyle(parenstack)
|
||||||
|
return "paren" .. ((#parenstack % 5) + 1)
|
||||||
|
end
|
||||||
|
function tokenizer.tokenize(syntax, text, state)
|
||||||
|
state = state or {}
|
||||||
|
local res, istate = tokenize(syntax, text, state.istate)
|
||||||
|
local parenstack = state.parenstack or ""
|
||||||
|
local newres = {}
|
||||||
|
-- split parens out
|
||||||
|
-- the stock tokenizer can't do this because it merges identical adjacent tokens
|
||||||
|
for i, type, text in tokenizer.each_token(res) do
|
||||||
|
if type == "normal" or type == "symbol" then
|
||||||
|
for normtext1, paren, normtext2 in text:gmatch("([^%(%[{}%]%)]*)([%(%[{}%]%)]?)([^%(%[{}%]%)]*)") do
|
||||||
|
if #normtext1 > 0 then
|
||||||
|
table.insert(newres, type)
|
||||||
|
table.insert(newres, normtext1)
|
||||||
|
end
|
||||||
|
if #paren > 0 then
|
||||||
|
if paren == parenstack:sub(-1) then -- expected closer
|
||||||
|
parenstack = parenstack:sub(1, -2)
|
||||||
|
table.insert(newres, parenstyle(parenstack))
|
||||||
|
elseif closers[paren] then -- opener
|
||||||
|
table.insert(newres, parenstyle(parenstack))
|
||||||
|
parenstack = parenstack .. closers[paren]
|
||||||
|
else -- unexpected closer
|
||||||
|
table.insert(newres, "paren_unbalanced")
|
||||||
|
end
|
||||||
|
table.insert(newres, paren)
|
||||||
|
end
|
||||||
|
if #normtext2 > 0 then
|
||||||
|
table.insert(newres, type)
|
||||||
|
table.insert(newres, normtext2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
table.insert(newres, type)
|
||||||
|
table.insert(newres, text)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return newres, { parenstack = parenstack, istate = istate }
|
||||||
|
end
|
||||||
|
|
||||||
|
style.syntax.paren_unbalanced = style.syntax.paren_unbalanced or { common.color "#DC0408" }
|
||||||
|
style.syntax.paren1 = style.syntax.paren1 or { common.color "#FC6F71"}
|
||||||
|
style.syntax.paren2 = style.syntax.paren2 or { common.color "#fcb053"}
|
||||||
|
style.syntax.paren3 = style.syntax.paren3 or { common.color "#fcd476"}
|
||||||
|
style.syntax.paren4 = style.syntax.paren4 or { common.color "#52dab2"}
|
||||||
|
style.syntax.paren5 = style.syntax.paren5 or { common.color "#5a98cf"}
|
|
@ -0,0 +1,40 @@
|
||||||
|
--[[
|
||||||
|
scalestatus.lua
|
||||||
|
displays current scale (zoom) in status view
|
||||||
|
version: 20200628_155804
|
||||||
|
originally by SwissalpS
|
||||||
|
|
||||||
|
Depends on plugin scale.lua version >= 20200628_154010
|
||||||
|
--]]
|
||||||
|
local scale = require "plugins.scale"
|
||||||
|
-- make sure plugin is installed and has get_scale field
|
||||||
|
if not scale.get_scale then
|
||||||
|
local core = require "core"
|
||||||
|
core.error("Plugin 'scale' needs to be updated, scalestatus inactive.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = require "core.config"
|
||||||
|
local StatusView = require "core.statusview"
|
||||||
|
|
||||||
|
config.scalestatus_format = '%.0f%%'
|
||||||
|
|
||||||
|
local get_items = StatusView.get_items
|
||||||
|
function StatusView:get_items()
|
||||||
|
|
||||||
|
local left, right = get_items(self)
|
||||||
|
|
||||||
|
local t = {
|
||||||
|
self.separator,
|
||||||
|
string.format(config.scalestatus_format, scale.get_scale() * 100),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item in ipairs(t) do
|
||||||
|
table.insert(right, item)
|
||||||
|
end
|
||||||
|
|
||||||
|
return left, right
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
|
@ -1,58 +1,20 @@
|
||||||
-- mod-version:3
|
|
||||||
local core = require "core"
|
local core = require "core"
|
||||||
local common = require "core.common"
|
|
||||||
local DocView = require "core.docview"
|
local DocView = require "core.docview"
|
||||||
local LogView = require "core.logview"
|
|
||||||
|
local workspace_filename = ".lite_workspace.lua"
|
||||||
|
|
||||||
|
|
||||||
local function workspace_files_for(project_dir)
|
local function serialize(val)
|
||||||
local basename = common.basename(project_dir)
|
if type(val) == "string" then
|
||||||
local workspace_dir = USERDIR .. PATHSEP .. "ws"
|
return string.format("%q", val)
|
||||||
local info_wsdir = system.get_file_info(workspace_dir)
|
elseif type(val) == "table" then
|
||||||
if not info_wsdir then
|
local t = {}
|
||||||
local ok, err = system.mkdir(workspace_dir)
|
for k, v in pairs(val) do
|
||||||
if not ok then
|
table.insert(t, "[" .. serialize(k) .. "]=" .. serialize(v))
|
||||||
error("cannot create workspace directory: \"" .. err .. "\"")
|
|
||||||
end
|
end
|
||||||
|
return "{" .. table.concat(t, ",") .. "}"
|
||||||
end
|
end
|
||||||
return coroutine.wrap(function()
|
return tostring(val)
|
||||||
local files = system.list_dir(workspace_dir) or {}
|
|
||||||
local n = #basename
|
|
||||||
for _, file in ipairs(files) do
|
|
||||||
if file:sub(1, n) == basename then
|
|
||||||
local id = tonumber(file:sub(n + 1):match("^-(%d+)$"))
|
|
||||||
if id then
|
|
||||||
coroutine.yield(workspace_dir .. PATHSEP .. file, id)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function consume_workspace_file(project_dir)
|
|
||||||
for filename, id in workspace_files_for(project_dir) do
|
|
||||||
local load_f = loadfile(filename)
|
|
||||||
local workspace = load_f and load_f()
|
|
||||||
if workspace and workspace.path == project_dir then
|
|
||||||
os.remove(filename)
|
|
||||||
return workspace
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function get_workspace_filename(project_dir)
|
|
||||||
local id_list = {}
|
|
||||||
for filename, id in workspace_files_for(project_dir) do
|
|
||||||
id_list[id] = true
|
|
||||||
end
|
|
||||||
local id = 1
|
|
||||||
while id_list[id] do
|
|
||||||
id = id + 1
|
|
||||||
end
|
|
||||||
local basename = common.basename(project_dir)
|
|
||||||
return USERDIR .. PATHSEP .. "ws" .. PATHSEP .. basename .. "-" .. tostring(id)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -83,18 +45,15 @@ local function save_view(view)
|
||||||
filename = view.doc.filename,
|
filename = view.doc.filename,
|
||||||
selection = { view.doc:get_selection() },
|
selection = { view.doc:get_selection() },
|
||||||
scroll = { x = view.scroll.to.x, y = view.scroll.to.y },
|
scroll = { x = view.scroll.to.x, y = view.scroll.to.y },
|
||||||
crlf = view.doc.crlf,
|
text = not view.doc.filename and view.doc:get_text(1, 1, math.huge, math.huge)
|
||||||
text = view.doc.new_file and view.doc:get_text(1, 1, math.huge, math.huge)
|
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
if mt == LogView then return end
|
|
||||||
for name, mod in pairs(package.loaded) do
|
for name, mod in pairs(package.loaded) do
|
||||||
if mod == mt then
|
if mod == mt then
|
||||||
return {
|
return {
|
||||||
type = "view",
|
type = "view",
|
||||||
active = (core.active_view == view),
|
active = (core.active_view == view),
|
||||||
module = name,
|
module = name
|
||||||
scroll = { x = view.scroll.to.x, y = view.scroll.to.y, to = { x = view.scroll.to.x, y = view.scroll.to.y } },
|
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -103,27 +62,16 @@ end
|
||||||
|
|
||||||
local function load_view(t)
|
local function load_view(t)
|
||||||
if t.type == "doc" then
|
if t.type == "doc" then
|
||||||
local dv
|
|
||||||
if not t.filename then
|
|
||||||
-- document not associated to a file
|
|
||||||
dv = DocView(core.open_doc())
|
|
||||||
else
|
|
||||||
-- we have a filename, try to read the file
|
|
||||||
local ok, doc = pcall(core.open_doc, t.filename)
|
local ok, doc = pcall(core.open_doc, t.filename)
|
||||||
if ok then
|
if not ok then
|
||||||
dv = DocView(doc)
|
return DocView(core.open_doc())
|
||||||
end
|
end
|
||||||
end
|
local dv = DocView(doc)
|
||||||
if dv and dv.doc then
|
if t.text then doc:insert(1, 1, t.text) end
|
||||||
if dv.doc.new_file and t.text then
|
doc:set_selection(table.unpack(t.selection))
|
||||||
dv.doc:insert(1, 1, t.text)
|
dv.last_line, dv.last_col = doc:get_selection()
|
||||||
dv.doc.crlf = t.crlf
|
|
||||||
end
|
|
||||||
dv.doc:set_selection(table.unpack(t.selection))
|
|
||||||
dv.last_line1, dv.last_col1, dv.last_line2, dv.last_col2 = dv.doc:get_selection()
|
|
||||||
dv.scroll.x, dv.scroll.to.x = t.scroll.x, t.scroll.x
|
dv.scroll.x, dv.scroll.to.x = t.scroll.x, t.scroll.x
|
||||||
dv.scroll.y, dv.scroll.to.y = t.scroll.y, t.scroll.y
|
dv.scroll.y, dv.scroll.to.y = t.scroll.y, t.scroll.y
|
||||||
end
|
|
||||||
return dv
|
return dv
|
||||||
end
|
end
|
||||||
return require(t.module)()
|
return require(t.module)()
|
||||||
|
@ -156,22 +104,13 @@ end
|
||||||
local function load_node(node, t)
|
local function load_node(node, t)
|
||||||
if t.type == "leaf" then
|
if t.type == "leaf" then
|
||||||
local res
|
local res
|
||||||
local active_view
|
for _, v in ipairs(t.views) do
|
||||||
for i, v in ipairs(t.views) do
|
|
||||||
local view = load_view(v)
|
local view = load_view(v)
|
||||||
if view then
|
|
||||||
if v.active then res = view end
|
if v.active then res = view end
|
||||||
node:add_view(view)
|
node:add_view(view)
|
||||||
if t.active_view == i then
|
|
||||||
active_view = view
|
|
||||||
end
|
end
|
||||||
if not view:is(DocView) then
|
if t.active_view then
|
||||||
view.scroll = v.scroll
|
node:set_active_view(node.views[t.active_view])
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if active_view then
|
|
||||||
node:set_active_view(active_view)
|
|
||||||
end
|
end
|
||||||
return res
|
return res
|
||||||
else
|
else
|
||||||
|
@ -184,63 +123,57 @@ local function load_node(node, t)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function save_directories()
|
|
||||||
local project_dir = core.project_dir
|
|
||||||
local dir_list = {}
|
|
||||||
for i = 2, #core.project_directories do
|
|
||||||
dir_list[#dir_list + 1] = common.relative_path(project_dir, core.project_directories[i].name)
|
|
||||||
end
|
|
||||||
return dir_list
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function save_workspace()
|
local function save_workspace()
|
||||||
local root = get_unlocked_root(core.root_view.root_node)
|
local root = get_unlocked_root(core.root_view.root_node)
|
||||||
local workspace_filename = get_workspace_filename(core.project_dir)
|
|
||||||
local fp = io.open(workspace_filename, "w")
|
local fp = io.open(workspace_filename, "w")
|
||||||
if fp then
|
if fp then
|
||||||
local node_text = common.serialize(save_node(root))
|
fp:write("return ", serialize(save_node(root)), "\n")
|
||||||
local dir_text = common.serialize(save_directories())
|
|
||||||
fp:write(string.format("return { path = %q, documents = %s, directories = %s }\n", core.project_dir, node_text, dir_text))
|
|
||||||
fp:close()
|
fp:close()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function load_workspace()
|
local function load_workspace()
|
||||||
local workspace = consume_workspace_file(core.project_dir)
|
local ok, t = pcall(dofile, workspace_filename)
|
||||||
if workspace then
|
os.remove(workspace_filename)
|
||||||
|
if ok then
|
||||||
local root = get_unlocked_root(core.root_view.root_node)
|
local root = get_unlocked_root(core.root_view.root_node)
|
||||||
local active_view = load_node(root, workspace.documents)
|
local active_view = load_node(root, t)
|
||||||
if active_view then
|
if active_view then
|
||||||
core.set_active_view(active_view)
|
core.set_active_view(active_view)
|
||||||
end
|
end
|
||||||
for i, dir_name in ipairs(workspace.directories) do
|
|
||||||
core.add_project_directory(system.absolute_path(dir_name))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local run = core.run
|
local run = core.run
|
||||||
|
|
||||||
function core.run(...)
|
function core.run(...)
|
||||||
if #core.docs == 0 then
|
if #core.docs == 0 then
|
||||||
core.try(load_workspace)
|
core.try(load_workspace)
|
||||||
|
|
||||||
local on_quit_project = core.on_quit_project
|
local exit = os.exit
|
||||||
function core.on_quit_project()
|
function os.exit(...)
|
||||||
core.try(save_workspace)
|
save_workspace()
|
||||||
on_quit_project()
|
exit(...)
|
||||||
end
|
|
||||||
|
|
||||||
local on_enter_project = core.on_enter_project
|
|
||||||
function core.on_enter_project(new_dir)
|
|
||||||
on_enter_project(new_dir)
|
|
||||||
core.try(load_workspace)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
core.run = run
|
core.run = run
|
||||||
return core.run(...)
|
return core.run(...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local run1 = core.run1
|
||||||
|
function core.run1(...)
|
||||||
|
if #core.docs == 0 then
|
||||||
|
core.try(load_workspace)
|
||||||
|
|
||||||
|
local exit = os.exit
|
||||||
|
function os.exit(...)
|
||||||
|
save_workspace()
|
||||||
|
exit(...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
core.run1 = run1
|
||||||
|
return core.run1(...)
|
||||||
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@ local style = require "core.style"
|
||||||
local common = require "core.common"
|
local common = require "core.common"
|
||||||
|
|
||||||
style.background = { common.color "#242424" } -- main background
|
style.background = { common.color "#242424" } -- main background
|
||||||
style.background2 = { common.color "#202020" } -- sidebar backgrounds
|
style.background2 = { common.color "#1a1a1a" } -- sidebar background and inactive tabs
|
||||||
style.background3 = { common.color "#202020" } -- bottombar background prompts
|
style.background3 = { common.color "#202020" } -- bottombar background prompts
|
||||||
style.text = { common.color "#9ea191" }
|
style.text = { common.color "#9ea191" }
|
||||||
style.caret = { common.color "#F8F8F0" }
|
style.caret = { common.color "#F8F8F0" }
|
||||||
|
|
|
@ -395,7 +395,7 @@ void game(unsigned frame, float dt, double t) {
|
||||||
int main(){
|
int main(){
|
||||||
window_title("Editor " EDITOR_VERSION);
|
window_title("Editor " EDITOR_VERSION);
|
||||||
window_create(flag("--transparent") ? 101 : 80,0);
|
window_create(flag("--transparent") ? 101 : 80,0);
|
||||||
window_icon("logo.png");
|
window_icon("scale-ruler-icon.png");
|
||||||
|
|
||||||
while( window_swap() ) {
|
while( window_swap() ) {
|
||||||
editor_frame(game);
|
editor_frame(game);
|
||||||
|
|
|
@ -576,7 +576,7 @@ void editor_frame( void (*game)(unsigned, float, double) ) {
|
||||||
game(editor.frame, editor.dt, editor.t);
|
game(editor.frame, editor.dt, editor.t);
|
||||||
|
|
||||||
// timing
|
// timing
|
||||||
editor.dt = window_delta() /*clampf(window_delta(), 0, 1/60.f)*/ * !window_has_pause() * editor.slomo;
|
editor.dt = clampf(window_delta(), 0, 1/60.f) * !window_has_pause() * editor.slomo;
|
||||||
editor.t += editor.dt;
|
editor.t += editor.dt;
|
||||||
editor.frame += !window_has_pause();
|
editor.frame += !window_has_pause();
|
||||||
editor.frame += !editor.frame;
|
editor.frame += !editor.frame;
|
||||||
|
|
|
@ -7,6 +7,15 @@
|
||||||
#include "3rd_lite.h"
|
#include "3rd_lite.h"
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
TODO("bug: lite key bindings are being sent to editor")
|
||||||
|
TODO("eval: https://github.com/Jipok/lite-plugins")
|
||||||
|
TODO("eval: https://github.com/drmargarido/linters")
|
||||||
|
TODO("eval: https://github.com/monolifed/theme16")
|
||||||
|
TODO("eval: https://github.com/takase1121/lite-contextmenu ")
|
||||||
|
TODO("eval: https://github.com/drmargarido/TodoTreeView")
|
||||||
|
TODO("eval: https://github.com/takase1121/lite-nagbar")
|
||||||
|
TODO("eval: https://github.com/rxi/console")
|
||||||
|
|
||||||
int ui_texture_fit(texture_t t, struct nk_rect bounds) {
|
int ui_texture_fit(texture_t t, struct nk_rect bounds) {
|
||||||
// allocate complete window space
|
// allocate complete window space
|
||||||
struct nk_rect total_space = nk_window_get_content_region(ui_ctx);
|
struct nk_rect total_space = nk_window_get_content_region(ui_ctx);
|
||||||
|
|
Loading…
Reference in New Issue