Many writing tools include the very useful metrics of reading time and number of words.
I thought it could be nice to have a similar thing in NeoVim.
I write two blogs in NeoVim (this one, and a tech blog), and I wanted to display the reading time, and number words for Markdown files.
Here is the script I use.
It’s worth noting that I use lualine
for my status line management.
Adapt to your needs according to what you use.
local function wordcount()
return tostring(vim.fn.wordcount().words) .. ' words'
end
local function readingtime()
return tostring(math.ceil(vim.fn.wordcount().words / 200.0)) .. ' min'
end
local function is_markdown()
return vim.bo.filetype == "markdown" or vim.bo.filetype == "asciidoc"
end
require 'lualine'.setup {
options = {
icons_enabled = true,
theme = 'onedark',
-- component_separators = { left = '', right = ''},
-- section_separators = { left = '', right = ''},
component_separators = '',
section_separators = '',
disabled_filetypes = { 'vim-plug', 'Outline' },
always_divide_middle = true,
globalstatus = true,
},
sections = {
lualine_a = { 'mode' },
lualine_b = { { 'branch', icon = '', color = { fg = c.cyan } }, 'diff' },
lualine_c = {
{
'filename',
path = 0,
symbols = { modified = ' ', readonly = ' ', unnamed = '[No Name]', newfile = '[New]' }
} },
lualine_x = { lsp, 'diagnostics', { 'filetype', colored = true, icon_only = false },
{ wordcount, cond = is_markdown },
{ readingtime, cond = is_markdown },
'encoding',
{ 'fileformat', icons_enabled = false } },
lualine_y = { 'progress' },
lualine_z = { 'location' }
},
inactive_sections = {
lualine_a = {},
lualine_b = {},
lualine_c = { 'filename' },
lualine_x = { 'location' },
lualine_y = {},
lualine_z = {}
},
winbar = {
lualine_a = {},
lualine_b = {},
lualine_c = { { 'filename', path = 1 }, { navic.get_location, cond = navic.is_available }, },
lualine_x = {},
lualine_y = {},
lualine_z = {}
},
inactive_winbar = {
lualine_a = {},
lualine_b = {},
lualine_c = { { 'filename', path = 1 }, { navic.get_location, cond = navic.is_available }, },
lualine_x = {},
lualine_y = {},
lualine_z = {}
},
tabline = {},
extensions = { 'fzf', 'nvim-tree', 'nvim-dap-ui' }
}
The important parts are:
{ wordcount, cond = is_markdown },
{ readingtime, cond = is_markdown },
Which means words count, and reading time will be displayed only for markdown
and asciidoc
file types.
The entire code for the lualine
can be found in my GitHub