1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
-- mod-version:3
local core = require "core"
local style = require "core.style"
local common = require "core.common"
local config = require "core.config"
local DocView = require "core.docview"
config.plugins.typingspeed = common.merge({
enabled = true,
-- characters that should be counted as word boundary
word_boundaries = "[%p%s]",
-- The config specification used by the settings gui
config_spec = {
name = "Typing Speed",
{
label = "Enabled",
description = "Show or hide the typing speed from the status bar.",
path = "enabled",
type = "toggle",
default = true,
on_apply = function(enabled)
core.add_thread(function()
if enabled then
core.status_view:get_item("typing-speed:stats"):show()
else
core.status_view:get_item("typing-speed:stats"):hide()
end
end)
end
},
{
label = "Word Boundaries",
description = "Lua pattern that matches characters to separate words.",
path = "word_boundaries",
type = "string",
default = "[%p%s]"
}
}
}, config.plugins.typingspeed)
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
if config.plugins.typingspeed.enabled then
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
end
coroutine.yield(1)
end
end)
local on_text_input = DocView.on_text_input
function DocView:on_text_input(text, idx)
if config.plugins.typingspeed.enabled then
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
end
on_text_input(self, text, idx)
end
core.status_view:add_item({
predicate = function()
return core.active_view and getmetatable(core.active_view) == DocView
end,
name = "typing-speed:stats",
alignment = core.status_view.Item.RIGHT,
get_item = function()
return {
style.text,
string.format("%.0f CPM / %.0f WPM", cpm, wpm)
}
end,
position = 1,
tooltip = "characters / words per minute",
separator = core.status_view.separator2
})
|