github github
stars 77
issues 5
subscribers 3
forks 3



18 days ago

v0.2.0 breaking change: add visited_at to Bookmark structure


You only need one shortcut to add bookmarks.

  • Toggle mark: Add and Remove mark with one shortcut
  • Mark with name: so you can record more information
  • Icon and virtual text: display icon and name at the marked lines
  • Group your bookmarks: so keep your away from the noises
  • Persistent your bookmarks into a human reable json file, which you can manipulate munally
  • More usecases
  • Video Explaination


Install and Config

  • Simple version: everything should work out of box if you are ok with the default config.
-- with lazy.nvim
return {
  dependencies = {
    {"stevearc/dressing.nvim"} -- optional: to have the same UI shown in the GIF

Right now we have only one config options

return { "LintaoAmons/bookmarks.nvim",
  config = function ()
    require("bookmarks").setup( {
      json_db_path = vim.fs.normalize(vim.fn.stdpath("config") .. "/bookmarks.db.json"),
      signs = {
        mark = { icon = "", color = "grey" },

Commands and Keybindings

There's two concepts in this plugin: BookmarkList and Bookmark. You can look into the code to find the structure of those two domain objects

Command Description
BookmarksMark Mark current line into active BookmarkList.
BookmarksGoto Go to bookmark at current active BookmarkList
BookmarksCommands Find and trigger a bookmark command.
BookmarksGotoRecent Go to latest visited/created Bookmark
Command Description
[List] new create a new BookmarkList and set it to active and mark current line into this BookmarkList
[List] rename rename a BookmarkList
[List] delete delete a bookmark list
[List] set active set a BookmarkList as active
[List] Browsing all lists
[Mark] mark to list bookmark current line and add it to specific bookmark list
[Mark] rename bookmark rename selected bookmark
[Mark] Browsing all marks
[Mark] delete bookmark delete selected bookmarks

This plugin don't provide any default keybinding. I recommend you to have those three keybindings.

vim.keymap.set({ "n", "v" }, "mm", "<cmd>BookmarksMark<cr>", { desc = "Mark current line into active BookmarkList." })
vim.keymap.set({ "n", "v" }, "mo", "<cmd>BookmarksGoto<cr>", { desc = "Go to bookmark at current active BookmarkList" })
vim.keymap.set({ "n", "v" }, "ma", "<cmd>BookmarksCommands<cr>", { desc = "Find and trigger a bookmark command." })
vim.keymap.set({ "n", "v" }, "mg", "<cmd>BookmarksGotoRecent<cr>", { desc = "Go to latest visited/created Bookmark" })



Don't hesitate to ask me anything about the codebase if you want to contribute.

You can contact with me by drop me an email or telegram




  • BookmarksMark's input box as a command line. Text start with ! considered as command.
    • !newlist [listname] bookmark current line into a newly created bookmark list and set the list as current active list.
  • remove parse commands, prefer BookmarkCommands instead
  • BookmarkCommands commands picker, a picker allow user to trigger any bookmark command.
  • user defined commands
  • more useful information when deal with corrupted json db (no issues report yet)
  • refactor: extract picker module
  • Telescope as default picker and will fallback to vim.ui if don't have telescope dependencies
  • telescope enhancement (use specific command instead)
  • Recent files as bookmarks: record all the buffer the user recently opened and sort by the visited_at
  • A new command to create bookmark and put it into specific bookmark list (instead current active one)
  • goto next/prev bookmark in the current buffer


  • filetree-like BookmarkList and Bookmark browsing.
  • smart location calibration according to bookmark content