diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/language_cpp.lua | 110 | ||||
-rw-r--r-- | plugins/language_rivet.lua (renamed from plugins/language_glaz.lua) | 55 | ||||
-rw-r--r-- | plugins/typingspeed.lua | 93 |
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 |