VERSION = "1.2.1" local micro = import("micro") local config = import("micro/config") local util = import("micro/util") local utf8 = import("unicode/utf8") function init() config.MakeCommand("wc", wordCount, config.NoComplete) config.AddRuntimeFile("wc", config.RTHelp, "help/wc.md") config.TryBindKey("F5", "lua:wc.wordCount", false) end function wordCount(bp) -- Buffer of selection/whole document local buffer --Get active cursor (to get selection) local cursor = bp.Buf:GetActiveCursor() --If cursor exists and there is selection, convert selection byte[] to string if cursor and cursor:HasSelection() then buffer = util.String(cursor:GetSelection()) else --no selection, convert whole buffer byte[] to string buffer = util.String(bp.Buf:Bytes()) end --length of the buffer/selection (string), utf8 friendly charCount = utf8.RuneCountInString(buffer) --Get word/line count using gsub's number of substitutions -- number of substitutions, pattern: %S+ (more than one non-whitespace characters) local _ , wordCount = buffer:gsub("%S+","") -- number of substitutions, pattern: \n (number of newline characters) local _, lineCount = buffer:gsub("\n", "") --add one to line count (since we're counting separators not lines above) lineCount = lineCount + 1 --display the message micro.InfoBar():Message("Lines:" .. lineCount .. " Words:"..wordCount.." Characters:"..charCount) end