diff options
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | plugins/typingspeed.lua | 93 |
2 files changed, 94 insertions, 0 deletions
@@ -144,6 +144,7 @@ to something other than a raw file it should be marked with an asterisk.* | [`titleize`](plugins/titleize.lua?raw=1) | Titleizes selected string (`hello world` => `Hello World`) | | [`todotreeview`](https://github.com/drmargarido/TodoTreeView)\* | Todo tree viewer for annotations in code like `TODO`, `BUG`, `FIX`, `IMPROVEMENT` | | [`togglesnakecamel`](plugins/togglesnakecamel.lua?raw=1) | Toggles symbols between `snake_case` and `camelCase` | +| [`typingspeed`](plugins/typingspeed.lua?raw=1) | Displays your current typing speed in characters and words per minute in the status bar | | [`unboundedscroll`](plugins/unboundedscroll.lua?raw=1) | Allows scrolling outside the bounds of a document | | [`updatechecker`](https://github.com/vincens2005/lite-xl-updatechecker)\* | Automatically checks for updates and notifies you | | [`vibe`](https://github.com/eugenpt/lite-xl-vibe)\* | VI(vim?) bindings with a hint of DOOM Emacs, for lite-xl | 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 |