aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/language_cpp.lua110
-rw-r--r--plugins/language_rivet.lua (renamed from plugins/language_glaz.lua)55
-rw-r--r--plugins/typingspeed.lua93
3 files changed, 208 insertions, 50 deletions
diff --git a/plugins/language_cpp.lua b/plugins/language_cpp.lua
index a0eb076..b1afa0f 100644
--- a/plugins/language_cpp.lua
+++ b/plugins/language_cpp.lua
@@ -1,6 +1,4 @@
-- mod-version:2 -- lite-xl 2.0
-pcall(require, "plugins.language_c")
-
local syntax = require "core.syntax"
syntax.add {
@@ -10,30 +8,89 @@ syntax.add {
"%.c++$", "%.hh$", "%.H$", "%.hxx$", "%.hpp$", "%.h++$"
},
comment = "//",
+ block_comment = { "/*", "*/" },
patterns = {
- { pattern = "//.-\n", type = "comment" },
- { pattern = { "/%*", "%*/" }, 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 = "#include%s+()<.->",
- type = { "keyword", "string" }
+ { pattern = "//.-\n", type = "comment" },
+ { pattern = { "/%*", "%*/" }, 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 = "##", type = "operator" },
+ { pattern = "struct%s()[%a_][%w_]*", type = {"keyword", "keyword2"} },
+ { pattern = "class%s()[%a_][%w_]*", type = {"keyword", "keyword2"} },
+ { pattern = "union%s()[%a_][%w_]*", type = {"keyword", "keyword2"} },
+ { pattern = "namespace%s()[%a_][%w_]*", type = {"keyword", "keyword2"} },
+ -- static declarations
+ { pattern = "static()%s+()inline",
+ type = { "keyword", "normal", "keyword" }
+ },
+ { pattern = "static()%s+()const",
+ type = { "keyword", "normal", "keyword" }
+ },
+ { pattern = "static()%s+()[%a_][%w_]*",
+ type = { "keyword", "normal", "literal" }
+ },
+ -- match method type declarations
+ { pattern = "[%a_][%w_]*()%s*()%**()%s*()[%a_][%w_]*()%s*()::",
+ type = {
+ "literal", "normal", "operator", "normal",
+ "literal", "normal", "operator"
+ }
+ },
+ -- match function type declarations
+ { pattern = "[%a_][%w_]*()%*+()%s+()[%a_][%w_]*%f[%(]",
+ type = { "literal", "operator", "normal", "function" }
+ },
+ { pattern = "[%a_][%w_]*()%s+()%*+()[%a_][%w_]*%f[%(]",
+ type = { "literal", "normal", "operator", "function" }
+ },
+ { pattern = "[%a_][%w_]*()%s+()[%a_][%w_]*%f[%(]",
+ type = { "literal", "normal", "function" }
+ },
+ -- match variable type declarations
+ { pattern = "[%a_][%w_]*()%*+()%s+()[%a_][%w_]*",
+ type = { "literal", "operator", "normal", "normal" }
+ },
+ { pattern = "[%a_][%w_]*()%s+()%*+()[%a_][%w_]*",
+ type = { "literal", "normal", "operator", "normal" }
+ },
+ { pattern = "[%a_][%w_]*()%s+()[%a_][%w_]*()%s*()[;,%[%)]",
+ type = { "literal", "normal", "normal", "normal", "normal" }
+ },
+ { pattern = "[%a_][%w_]*()%s+()[%a_][%w_]*()%s*()=",
+ type = { "literal", "normal", "normal", "normal", "operator" }
+ },
+ { pattern = "[%a_][%w_]*()&()%s+()[%a_][%w_]*",
+ type = { "literal", "operator", "normal", "normal" }
+ },
+ { pattern = "[%a_][%w_]*()%s+()&()[%a_][%w_]*",
+ type = { "literal", "normal", "operator", "normal" }
},
- { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
- { pattern = "[%a_][%w_]*%f[(]", type = "function" },
-- Match scope operator element access
- { pattern = "[%a_][%w_]*[%s]*%f[:]",type = "literal" },
- -- Uppercase constants of at least 3 characters in len
- { pattern = "%u[%u_][%u%d_]+", type = "number" },
+ { pattern = "[%a_][%w_]*()%s*()::",
+ type = { "literal", "normal", "operator" }
+ },
+ -- Uppercase constants of at least 2 chars in len
+ { pattern = "_?%u[%u_][%u%d_]*%f[%s%+%*%-%.%)%]}%?%^%%=/<>~|&;:,!]",
+ type = "number"
+ },
-- Magic constants
- { pattern = "__[%u]+__", type = "number" },
- -- Somehow makes macros properly work
- { pattern = "#[%a_][%w_]*", type = "symbol" },
+ { pattern = "__[%u%l]+__", type = "number" },
+ -- all other functions
+ { pattern = "[%a_][%w_]*%f[(]", type = "function" },
+ -- Macros
+ { pattern = "^%s*#%s*define%s+()[%a_][%a%d_]*",
+ type = { "keyword", "symbol" }
+ },
+ { pattern = "#%s*include%s+()<.->",
+ type = { "keyword", "string" }
+ },
+ { pattern = "%f[#]#%s*[%a_][%w_]*", type = "keyword" },
-- Everything else to make the tokenizer work properly
- { pattern = "[%a_][%w_]*", type = "symbol" },
+ { pattern = "[%a_][%w_]*", type = "symbol" },
},
symbols = {
["alignof"] = "keyword",
@@ -84,6 +141,7 @@ syntax.add {
["typeid"] = "keyword",
["typename"] = "keyword",
["mutable"] = "keyword",
+ ["override"] = "keyword",
["virtual"] = "keyword",
["using"] = "keyword",
["namespace"] = "keyword",
@@ -100,7 +158,7 @@ syntax.add {
["continue"] = "keyword",
["return"] = "keyword",
["goto"] = "keyword",
- ["struct"] = "keyword2",
+ ["struct"] = "keyword",
["union"] = "keyword",
["typedef"] = "keyword",
["enum"] = "keyword",
@@ -113,7 +171,7 @@ syntax.add {
["case"] = "keyword",
["default"] = "keyword",
["auto"] = "keyword",
- ["void"] = "keyword",
+ ["void"] = "keyword2",
["int"] = "keyword2",
["short"] = "keyword2",
["long"] = "keyword2",
@@ -122,13 +180,13 @@ syntax.add {
["char"] = "keyword2",
["unsigned"] = "keyword2",
["bool"] = "keyword2",
- ["true"] = "keyword2",
- ["false"] = "keyword2",
+ ["true"] = "literal",
+ ["false"] = "literal",
+ ["NULL"] = "literal",
["wchar_t"] = "keyword2",
["char8_t"] = "keyword2",
["char16_t"] = "keyword2",
["char32_t"] = "keyword2",
- ["NULL"] = "literal",
["#include"] = "keyword",
["#if"] = "keyword",
["#ifdef"] = "keyword",
diff --git a/plugins/language_glaz.lua b/plugins/language_rivet.lua
index bfff246..b291749 100644
--- a/plugins/language_glaz.lua
+++ b/plugins/language_rivet.lua
@@ -1,17 +1,20 @@
-- mod-version:2 -- lite-xl 2.0
+-- Syntax highlighting for the Rivet programming language.
+-- by StunxFS :)
+
local syntax = require "core.syntax"
syntax.add {
- name = "Glaz",
- files = {"%.glaz$", "^glaz%.proj$"},
+ name = "Rivet",
+ files = {"%.ri$"},
comment = "//",
block_comment = {"/*", "*/"},
patterns = {
{pattern = "//.-\n", type = "comment"},
{pattern = {"/%*", "%*/"}, type = "comment"},
{pattern = {'"', '"', "\\"}, type = "string"},
- {pattern = "'.'", type = "string"},
+ {pattern = "'\\?.'", type = "string"},
{pattern = "0b[01_]+", type = "number"},
{pattern = "0o[0-7_]+", type = "number"},
{pattern = "0x[%x_]+", type = "number"},
@@ -25,52 +28,57 @@ syntax.add {
{pattern = "[%a_][%w_]*%f[(]", type = "function"},
{pattern = "[%a_][%w_]*!%f[%[(]", type = "keyword2"},
{pattern = "[%a_][%w_]*", type = "symbol"},
- {pattern = {"@%[", "%]"}, type = "keyword"},
{pattern = "%$%s?[%a_][%w_]*", type = "keyword"},
{pattern = "#%s?include%s()<.->", type = {"keyword", "string"}},
{pattern = "#%s?[%a_][%w_]*", type = "keyword"}
},
symbols = {
- ["mod"] = "keyword",
- ["src"] = "keyword",
["extern"] = "keyword",
- ["interface"] = "keyword",
+ ["use"] = "keyword",
+
+ ["pub"] = "keyword",
+ ["as"] = "keyword",
+
+ ["pkg"] = "keyword",
+ ["mod"] = "keyword",
+ ["const"] = "keyword",
+ ["trait"] = "keyword",
["struct"] = "keyword",
["union"] = "keyword",
["type"] = "keyword",
["enum"] = "keyword",
- ["impl"] = "keyword",
["fn"] = "keyword",
["test"] = "keyword",
- ["pub"] = "keyword",
- ["use"] = "keyword",
+ ["impl"] = "keyword",
+
+ ["match"] = "keyword",
["if"] = "keyword",
["elif"] = "keyword",
["else"] = "keyword",
- ["do"] = "keyword",
+ ["loop"] = "keyword",
["while"] = "keyword",
["for"] = "keyword",
- ["loop"] = "keyword",
+
["break"] = "keyword",
["continue"] = "keyword",
["return"] = "keyword",
["raise"] = "keyword",
- ["goto"] = "keyword",
- ["unsafe"] = "keyword",
- ["const"] = "keyword",
+
["let"] = "keyword",
["mut"] = "keyword",
- ["switch"] = "keyword",
- ["defer"] = "keyword",
+ ["unsafe"] = "keyword",
+ ["goto"] = "keyword",
["try"] = "keyword",
["orelse"] = "keyword",
["catch"] = "keyword",
- ["as"] = "keyword",
+ ["cast"] = "keyword",
["is"] = "keyword",
["in"] = "keyword",
- ["and"] = "keyword",
["or"] = "keyword",
+ ["and"] = "keyword",
+
-- types
+ ["bool"] = "keyword2",
["i8"] = "keyword2",
["i16"] = "keyword2",
["i32"] = "keyword2",
@@ -81,20 +89,19 @@ syntax.add {
["u64"] = "keyword2",
["f32"] = "keyword2",
["f64"] = "keyword2",
- ["bool"] = "keyword2",
- ["rune"] = "keyword2",
+ ["char"] = "keyword2",
["isize"] = "keyword2",
["usize"] = "keyword2",
["str"] = "keyword2",
- ["charptr"] = "keyword2",
["rawptr"] = "keyword2",
- ["map"] = "keyword2",
+ ["Self"] = "keyword2",
+
-- literals
["base"] = "literal",
["self"] = "literal",
["true"] = "literal",
["false"] = "literal",
- ["null"] = "literal"
+ ["none"] = "literal"
}
}
diff --git a/plugins/typingspeed.lua b/plugins/typingspeed.lua
new file mode 100644
index 0000000..62e44ef
--- /dev/null
+++ b/plugins/typingspeed.lua
@@ -0,0 +1,93 @@
+-- mod-version:2
+
+local core = require "core"
+local style = require "core.style"
+local common = require "core.common"
+local config = require "core.config"
+local DocView = require "core.docview"
+
+if common["merge"] then
+ config.plugins.typingspeed = common.merge({
+ -- characters that should be counted as word boundary
+ word_boundaries = "[%p%s]",
+ }, config.plugins.keystats)
+else
+ config.plugins.typingspeed = {
+ -- characters that should be counted as word boundary
+ word_boundaries = "[%p%s]",
+ }
+end
+
+local chars = 0
+local chars_last = 0
+local words = 0
+local words_last = 0
+local time_last = 0
+local started_word = false
+local cpm = 0
+local wpm = 0
+
+core.add_thread(function()
+ while true do
+ local t = os.date("*t")
+ if t.sec <= time_last then
+ words_last = words
+ words = 0
+ chars_last = chars
+ chars = 0
+ time_last = t.sec
+ end
+ wpm = words_last * (1-(t.sec)/60) + words
+ cpm = chars_last * (1-(t.sec)/60) + chars
+ coroutine.yield(1)
+ end
+end)
+
+local on_text_input = DocView.on_text_input
+function DocView:on_text_input(text, idx)
+ chars = chars + 1
+ if string.find(text, config.plugins.typingspeed.word_boundaries) then
+ if started_word then
+ words = words + 1
+ started_word = false
+ end
+ else
+ started_word = true
+ end
+ on_text_input(self, text, idx)
+end
+
+if core.status_view["add_item"] then
+ core.status_view:add_item(
+ function()
+ return core.active_view and getmetatable(core.active_view) == DocView
+ end,
+ "keystats:stats",
+ core.status_view.Item.RIGHT,
+ function()
+ return {
+ style.text,
+ string.format("%.0f CPM / %.0f WPM", cpm, wpm)
+ }
+ end,
+ nil,
+ 1,
+ "characters / words per minute"
+ ).separator = core.status_view.separator2
+else
+ local get_items = core.status_view.get_items
+ function core.status_view:get_items()
+ local left, right = get_items(self)
+
+ local t = {
+ style.text, string.format("%.0f CPM / %.0f WPM", cpm, wpm),
+ style.dim, self.separator2
+ }
+
+ for i, item in ipairs(t) do
+ table.insert(right, i, item)
+ end
+
+ return left, right
+ end
+end