feed.nvim is a web feed reader in neovim, leveraging modern neovim features and plugin system
🚧 🚧 🚧
This project is in beta, many features are incomplete, but is already useable for most feeds, trying out and contributions are welcome!
see roadmap for where this project goes
🚧 🚧 🚧
- 🌲 reliable and fast rss/atom/json feed parsing, powered by tree-sitter
- 📝 feeds converted to markdown/neorg for reading and storing
- 🏪 pure lua database with no extra dependency
- 📚 powerful filtering of feeds and entries, inspired by elfeed
- 📶 RSSHub integration to turn (almost) any link into a web feed
requires
nvim 0.10
andcurl
to be installed on your path.
Using rocks.nvim:
Rocks install feed.nvim
Using lazy.nvim:
return {
'neo451/feed.nvim',
dependencies = {
'neo451/treedoc.nvim',
'stevearc/conform.nvim',
'j-hui/fidget.nvim',
'nvim-lua/plenary.nvim',
'nvim-treesitter/nvim-treesitter',
}
opts = {}
}
-- somewhere in your config that sets up nvim-treesitter, add these three filetypes to the ensure_installed list:
require("nvim-treesitter.configs").setup {
ensure_installed = { "xml", "html", "markdown" },
}
- run
:checkhealth feed
to see your installation status
- Use
Feed
command to open the default index, there are two main kinds of index:- The
elfeed
style search buffer, everything is a flat list to be searched - The
telescope
picker, good for searching through all your database or searchby feed
- The
- Use
Feed <Tab>
to find out more actions binded toFeed
buffers
- Use
Feed load_opml
to import your opml file - Use
Feed export_opml
to export your opml file to load in other readers
-
To Be Implemented
-
Will support all the syntax of elfeed
- To Be Implemented
- To Be Implemented
- these are the defaults, no need to copy, only set the ones you wish to change
require"feed".setup{
---@type string
db_dir = vim.fn.stdpath("data") .. "/feed",
---@type { index : table<string, string | function>, entry : table<string, string | function> }
keymaps = {
index = {
["<CR>"] = "show_entry",
["<M-CR>"] = "show_in_split",
["+"] = "tag",
["-"] = "untag",
["?"] = "which_key",
b = "show_in_browser",
w = "show_in_w3m",
r = "refresh",
y = "link_to_clipboard",
q = "quit_index",
},
entry = {
["}"] = "show_next",
["{"] = "show_prev",
["?"] = "which_key",
u = "urlview",
q = "quite_entry",
},
},
---@type table<string, any>
win_options = {
conceallevel = 0,
wrap = true,
},
---@type table<string, any>
buf_options = {
filetype = "markdown", -- TODO: FeedBuffer?
modifiable = false,
},
---@type table<string, any>
search = {
sort_order = "descending",
update_hook = {},
filter = "@6-months-ago +unread",
},
---@type table<string, any>
layout = {
title = {
right_justify = false,
width = 70,
},
date = {
format = "%Y-%m-%d",
width = 10,
},
---@type string
split = "13split",
},
---@type string
colorscheme = "morning",
---@type feed.feed[]
feeds = {},
}