https://github.com/wsdjeg/calendar.nvim
A minimal calendar plugin for Neovim.
https://github.com/wsdjeg/calendar.nvim
neovim-plugin
Last synced: 3 months ago
JSON representation
A minimal calendar plugin for Neovim.
- Host: GitHub
- URL: https://github.com/wsdjeg/calendar.nvim
- Owner: wsdjeg
- License: gpl-3.0
- Created: 2026-01-01T11:52:13.000Z (4 months ago)
- Default Branch: master
- Last Pushed: 2026-01-16T00:51:18.000Z (4 months ago)
- Last Synced: 2026-01-16T06:34:11.005Z (4 months ago)
- Topics: neovim-plugin
- Language: Lua
- Homepage:
- Size: 68.4 KB
- Stars: 12
- Watchers: 1
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-neovim - wsdjeg/calendar.nvim - A simple floating calendar with extensions support. (UI / OS-specific)
- awesome-neovim-sorted - wsdjeg/calendar.nvim
README
# calendar.nvim
A minimal calendar plugin for Neovim.
[](LICENSE)
[](https://github.com/wsdjeg/calendar.nvim/issues)
[](https://github.com/wsdjeg/calendar.nvim/commits/master/)
[](https://github.com/wsdjeg/calendar.nvim/releases)
[](https://luarocks.org/modules/wsdjeg/calendar.nvim)

- [✨ Features](#-features)
- [📦 Installation](#-installation)
- [🔧 Configuration](#-configuration)
- [locales](#locales)
- [🧩 Custom extensions](#-custom-extensions)
- [register extension manually](#register-extension-manually)
- [automatically extensions](#automatically-extensions)
- [🖼️ Screenshots](#-screenshots)
- [📣 Self-Promotion](#-self-promotion)
- [💬 Feedback](#-feedback)
- [🙏 Credits](#-credits)
- [📄 License](#-license)
## ✨ Features
- Monthly calendar view in Neovim
- Vim-style keyboard navigation
- Today highlighting and custom day highlights
- Marked days support
- Extensible architecture
- Configurable setup and keymaps
- Pure Lua, lightweight, no dependencies
## 📦 Installation
```lua
return {
'wsdjeg/calendar.nvim',
}
```
## 🔧 Configuration
```lua
require('calendar').setup({
mark_icon = '•',
-- locale currently affects UI language only.
locale = 'en-US', -- en-US | de-DE | en-GB | es-ES | fr-FR | it-IT | ja-JP | ko-KR | zh-CN | zh-TW | ru-RU
show_adjacent_days = true,
-- calendar.nvim support vim style keyboard navigation, hjkl.
keymap = {
next_month = 'L',
previous_month = 'H',
next_day = 'l',
previous_day = 'h',
next_week = 'j',
previous_week = 'k',
today = 't',
close = 'q',
},
highlights = {
current = 'Visual',
today = 'Todo',
mark = 'Todo',
adjacent_days = 'Comment',
},
locales = {} -- See `## Locales`
})
```
### locales
`locales` config is extendable.
(e.g. Add `my-LC` locale based on `en-US`)
```lua
require('calendar').setup({
locale = 'my-LC',
locales = {
['my-LC'] = {
-- stylua: ignore
months = { 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' },
weekdays = { 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' },
year_month = function(year, month, months)
return string.format('%s %d', months[month], year)
end,
},
},
})
```
## 🧩 Custom extensions
calendar.nvim supports extensions which can be used to mark specific date.
### register extension manually
for example:
here is a simple extension to add [zettelkasten.nvim](https://github.com/wsdjeg/zettelkasten.nvim) support to calendar.nvim
```lua
local zk_ext = {}
function zk_ext.get(year, month)
local notes = require('zettelkasten.browser').get_notes()
local marks = {}
for _, note in ipairs(notes) do
local t = vim.split(note.id, '-')
if tonumber(t[1]) == year and tonumber(t[2]) == month then
table.insert(
marks,
{
year = tonumber(t[1]),
month = tonumber(t[2]),
day = tonumber(t[3]),
}
)
end
end
return marks
end
require('calendar.extensions').register('zettelkasten', zk_ext)
```
### automatically extensions
create `lua/calendar/extensions/zettelkasten.lua`
```lua
local extension = {}
function extension.get(year, month)
local notes = require('zettelkasten.browser').get_notes()
local marks = {}
for _, note in ipairs(notes) do
local t = vim.split(note.id, '-')
if tonumber(t[1]) == year and tonumber(t[2]) == month then
table.insert(marks, {
year = tonumber(t[1]),
month = tonumber(t[2]),
day = tonumber(t[3]),
})
end
end
return marks
end
extension.actions = {
create_daily_note = function(year, month, day) end,
view_daily_notes = function(year, month, day) end,
}
return extension
```
## 🖼️ Screenshots

## 📣 Self-Promotion
Like this plugin? Star the repository on
GitHub.
Love this plugin? Follow [me](https://wsdjeg.net/) on
[GitHub](https://github.com/wsdjeg).
## 💬 Feedback
If you encounter any bugs or have suggestions, please file an issue in the [issue tracker](https://github.com/wsdjeg/calendar.nvim/issues)
## 🙏 Credits
- [calendar](https://github.com/itchyny/calendar.vim)
## 📄 License
Licensed under GPL-3.0.