aboutsummaryrefslogtreecommitdiff
path: root/plugins/typingspeed.lua
diff options
context:
space:
mode:
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