aboutsummaryrefslogtreecommitdiff
path: root/plugins/typingspeed.lua
diff options
context:
space:
mode:
authorB14CK313 <jajoblack@gmx.de>2022-04-01 23:02:25 +0200
committerGitHub <noreply@github.com>2022-04-01 17:02:25 -0400
commitb97fc0b1cc93fe0d7d464b978e62f250a9738a5f (patch)
tree4d490c5a0020e3f0c7f43f2c964fc9c562b6a4c1 /plugins/typingspeed.lua
parentb45b10654d82033978faa29d662eac1df09fe5a1 (diff)
downloadlite-xl-plugins-b97fc0b1cc93fe0d7d464b978e62f250a9738a5f.tar.gz
lite-xl-plugins-b97fc0b1cc93fe0d7d464b978e62f250a9738a5f.zip
typingspeed: added typingspeed plugin (#47)
This plugin displays your current typing speed in characters per minute and words per minute in the status bar. I tried to keep the logic very simple, so instead of using real accurate values, it counts characters/words in the current minute and adds the value of the previous minute multiplied by the percentage needed to 'complete' the current minute (so it basically always displays the value for one minute, but the part of it that falls into the last minute uses the average): ``` words_last * (1 - (t.sec) / 60) + words ``` This should give fairly good results without the need for complicated code or falling back to 0 after every minute.
Diffstat (limited to 'plugins/typingspeed.lua')
-rw-r--r--plugins/typingspeed.lua93
1 files changed, 93 insertions, 0 deletions
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