fix: critical bugs and add documentation

- Fix missing path separator in glob patterns (files were not found)
- Fix nvim-tree setup overriding user config on every IdeaTree call
- Fix deprecated nvim API (nvim_buf_set_option, nvim_win_set_option)
- Fix missing arguments in sidebar.open() call in list.lua
- Remove unused variable in tags.lua
- Update help documentation with all commands
- Fix README.md (telescope reference, add changelog link)
- Add CHANGELOG.md
- Add llms.txt for AI/LLM context
This commit is contained in:
Carlos Gutierrez
2026-01-10 22:34:10 -05:00
parent 3dc33a46bb
commit de8ccfb9aa
9 changed files with 425 additions and 139 deletions

View File

@@ -11,7 +11,7 @@ local M = {}
function M.list_all()
local path = config.options.idea_dir
-- Find all .md files recursively
local files = vim.fn.glob(path .. "**/*.md", false, true)
local files = vim.fn.glob(path .. "/**/*.md", false, true)
if #files == 0 then
vim.notify("📂 No idea files found", vim.log.levels.INFO)
@@ -21,7 +21,8 @@ function M.list_all()
-- Present file selection UI
vim.ui.select(files, { prompt = "📂 Select an idea file to open:" }, function(choice)
if choice then
sidebar.open(choice) -- Open the selected file in sidebar
local filename = vim.fn.fnamemodify(choice, ":t")
sidebar.open(choice, filename, false) -- Open the selected file in sidebar
end
end)
end

View File

@@ -71,7 +71,7 @@ function M.fuzzy_search(query)
local results = {}
-- Find all .md files recursively
local files = vim.fn.glob(idea_path .. "**/*.md", false, true)
local files = vim.fn.glob(idea_path .. "/**/*.md", false, true)
for _, file in ipairs(files) do
if vim.fn.filereadable(file) == 1 then
@@ -199,7 +199,7 @@ function M.search_in_content(query)
local results = {}
-- Find all .md files recursively
local files = vim.fn.glob(idea_path .. "**/*.md", false, true)
local files = vim.fn.glob(idea_path .. "/**/*.md", false, true)
for _, file in ipairs(files) do
if vim.fn.filereadable(file) == 1 then
@@ -257,7 +257,7 @@ function M.search_by_title(query)
local results = {}
-- Find all .md files recursively
local files = vim.fn.glob(idea_path .. "**/*.md", false, true)
local files = vim.fn.glob(idea_path .. "/**/*.md", false, true)
for _, file in ipairs(files) do
if vim.fn.filereadable(file) == 1 then

View File

@@ -80,7 +80,7 @@ function M.get_all_tags()
local seen = {}
-- Find all .md files recursively
local files = vim.fn.glob(idea_path .. "**/*.md", false, true)
local files = vim.fn.glob(idea_path .. "/**/*.md", false, true)
for _, file in ipairs(files) do
if vim.fn.filereadable(file) == 1 then
@@ -203,7 +203,7 @@ function M.get_files_by_tag(tag)
local matching_files = {}
-- Find all .md files recursively
local files = vim.fn.glob(idea_path .. "**/*.md", false, true)
local files = vim.fn.glob(idea_path .. "/**/*.md", false, true)
for _, file in ipairs(files) do
if vim.fn.filereadable(file) == 1 then
@@ -264,7 +264,6 @@ function M.show_files_with_tag(tag)
-- Format file names for display
local file_choices = {}
for _, file in ipairs(files) do
local filename = vim.fn.fnamemodify(file, ":t")
local relative_path = file:sub(#config.options.idea_dir + 2) -- Remove idea_dir + "/"
table.insert(file_choices, relative_path)
end

View File

@@ -29,7 +29,7 @@ function M.open(file, filename, use_buffer)
-- Create a new buffer
local buf = vim.api.nvim_create_buf(false, true)
vim.api.nvim_buf_set_option(buf, "filetype", "markdown")
vim.bo[buf].filetype = "markdown"
-- Calculate window dimensions (30% of screen width, 80% of screen height)
local width = math.floor(vim.o.columns * 0.3)
@@ -124,9 +124,9 @@ function M.open_right_side(file, filename)
-- Create buffer if it doesn't exist
if not right_side_buf or not vim.api.nvim_buf_is_valid(right_side_buf) then
right_side_buf = vim.api.nvim_create_buf(false, false)
vim.api.nvim_buf_set_option(right_side_buf, "filetype", "markdown")
vim.api.nvim_buf_set_option(right_side_buf, "buftype", "acwrite")
vim.api.nvim_buf_set_option(right_side_buf, "bufhidden", "hide")
vim.bo[right_side_buf].filetype = "markdown"
vim.bo[right_side_buf].buftype = "acwrite"
vim.bo[right_side_buf].bufhidden = "hide"
-- Set up autosave for the right-side buffer
vim.api.nvim_create_autocmd("BufWriteCmd", {
@@ -190,11 +190,11 @@ function M.open_right_side(file, filename)
})
-- Set window options
vim.api.nvim_win_set_option(right_side_win, "wrap", true)
vim.api.nvim_win_set_option(right_side_win, "number", true)
vim.api.nvim_win_set_option(right_side_win, "relativenumber", false)
vim.api.nvim_win_set_option(right_side_win, "cursorline", true)
vim.api.nvim_win_set_option(right_side_win, "winhl", "Normal:Normal,FloatBorder:FloatBorder")
vim.wo[right_side_win].wrap = true
vim.wo[right_side_win].number = true
vim.wo[right_side_win].relativenumber = false
vim.wo[right_side_win].cursorline = true
vim.wo[right_side_win].winhl = "Normal:Normal,FloatBorder:FloatBorder"
-- Set up autosave on window close
vim.api.nvim_create_autocmd("WinClosed", {

View File

@@ -8,6 +8,7 @@ local M = {}
-- Tree state
local tree_callback = nil
local original_cwd = nil
local ideadrop_tree_autocmd_group = nil
---Opens nvim-tree focused on the idea directory
---@param callback fun(file_path: string): nil Callback function when a file is selected
@@ -16,8 +17,8 @@ function M.open_tree_window(callback)
tree_callback = callback
-- Check if nvim-tree is available
local has_nvim_tree, nvim_tree = pcall(require, "nvim-tree")
if not has_nvim_tree then
local has_nvim_tree_api, nvim_tree_api = pcall(require, "nvim-tree.api")
if not has_nvim_tree_api then
vim.notify("❌ nvim-tree is not installed. Please install nvim-tree to use this feature.", vim.log.levels.ERROR)
return
end
@@ -27,112 +28,66 @@ function M.open_tree_window(callback)
-- Change to idea directory
local idea_path = config.options.idea_dir
if vim.fn.isdirectory(idea_path) == 1 then
vim.cmd("cd " .. vim.fn.fnameescape(idea_path))
else
vim.notify("❌ Idea directory not found: " .. idea_path, vim.log.levels.ERROR)
return
if vim.fn.isdirectory(idea_path) == 0 then
-- Create the directory if it doesn't exist
vim.fn.mkdir(idea_path, "p")
end
-- Set up nvim-tree to open on the left side
nvim_tree.setup({
view = {
side = "left",
width = 30,
},
actions = {
open_file = {
quit_on_open = false,
},
},
on_attach = function(bufnr)
-- Override the default file opening behavior
local api = require("nvim-tree.api")
-- Map Enter to custom handler
vim.keymap.set("n", "<CR>", function()
local node = api.tree.get_node_under_cursor()
if node and node.type == "file" then
-- Call our callback with the selected file
if tree_callback then
tree_callback(node.absolute_path)
end
-- Create autocmd group for ideaDrop tree handling
if ideadrop_tree_autocmd_group then
vim.api.nvim_del_augroup_by_id(ideadrop_tree_autocmd_group)
end
ideadrop_tree_autocmd_group = vim.api.nvim_create_augroup("IdeaDropTree", { clear = true })
-- Set up autocmd to handle file selection from nvim-tree
vim.api.nvim_create_autocmd("BufEnter", {
group = ideadrop_tree_autocmd_group,
callback = function(args)
local bufname = vim.api.nvim_buf_get_name(args.buf)
-- Check if this is a markdown file in the idea directory
if bufname:match("%.md$") and bufname:find(idea_path, 1, true) then
-- Call our callback with the selected file
if tree_callback then
-- Close nvim-tree
api.tree.close()
nvim_tree_api.tree.close()
-- Restore original working directory
if original_cwd then
vim.cmd("cd " .. vim.fn.fnameescape(original_cwd))
end
else
-- Default behavior for directories
api.node.open.edit()
-- Use vim.schedule to avoid issues with buffer switching
vim.schedule(function()
tree_callback(bufname)
end)
-- Clear the autocmd group after handling
vim.api.nvim_del_augroup_by_id(ideadrop_tree_autocmd_group)
ideadrop_tree_autocmd_group = nil
end
end, { buffer = bufnr, noremap = true, silent = true })
-- Map 'q' to close tree and restore directory
vim.keymap.set("n", "q", function()
api.tree.close()
if original_cwd then
vim.cmd("cd " .. vim.fn.fnameescape(original_cwd))
end
end, { buffer = bufnr, noremap = true, silent = true })
-- Keep other default mappings
vim.keymap.set("n", "<C-]>", api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<C-e>", api.node.open.replace_tree_buffer, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<C-k>", api.node.show_info_popup, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<C-r>", api.fs.rename_sub, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<C-t>", api.node.open.tab, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<C-v>", api.node.open.vertical, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<C-x>", api.node.open.horizontal, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<BS>", api.node.navigate.parent_close, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<Tab>", api.node.open.preview, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", ">", api.node.navigate.sibling.next, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<", api.node.navigate.sibling.prev, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", ".", api.node.run.cmd, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "-", api.tree.change_root_to_parent, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "a", api.fs.create, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "bmv", api.marks.bulk.move, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "B", api.tree.toggle_no_buffer_filter, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "c", api.fs.copy.node, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "C", api.tree.toggle_git_clean_filter, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "[c", api.node.navigate.git.prev, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "]c", api.node.navigate.git.next, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "d", api.fs.remove, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "D", api.fs.trash, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "E", api.tree.expand_all, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "e", api.fs.rename_basename, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "]e", api.node.navigate.diagnostics.next, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "[e", api.node.navigate.diagnostics.prev, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "F", api.live_filter.clear, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "f", api.live_filter.start, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "g?", api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "gy", api.fs.copy.absolute_path, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "H", api.tree.toggle_hidden_filter, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "I", api.tree.toggle_gitignore_filter, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "J", api.node.navigate.sibling.last, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "K", api.node.navigate.sibling.first, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "m", api.marks.toggle, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "o", api.node.open.edit, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "O", api.node.open.no_window_picker, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "P", api.node.navigate.parent, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "r", api.fs.rename, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "R", api.tree.reload, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "s", api.node.run.system, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "S", api.tree.search_node, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "U", api.tree.toggle_custom_filter, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "W", api.tree.collapse_all, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "x", api.fs.cut, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "y", api.fs.copy.filename, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "Y", api.fs.copy.relative_path, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<2-LeftMouse>", api.node.open.edit, { buffer = bufnr, noremap = true, silent = true })
vim.keymap.set("n", "<2-RightMouse>", api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true })
end
end,
})
-- Open nvim-tree using the correct API
local api = require("nvim-tree.api")
api.tree.open()
-- Set up autocmd to restore cwd when nvim-tree is closed
vim.api.nvim_create_autocmd("BufLeave", {
group = ideadrop_tree_autocmd_group,
pattern = "NvimTree_*",
callback = function()
-- Restore original working directory when leaving nvim-tree
if original_cwd then
vim.schedule(function()
-- Only restore if we're not in an idea file
local current_buf = vim.api.nvim_get_current_buf()
local bufname = vim.api.nvim_buf_get_name(current_buf)
if not (bufname:match("%.md$") and bufname:find(idea_path, 1, true)) then
vim.cmd("cd " .. vim.fn.fnameescape(original_cwd))
end
end)
end
end,
})
-- Open nvim-tree in the idea directory (without calling setup)
-- This preserves the user's nvim-tree configuration
nvim_tree_api.tree.open({ path = idea_path })
end
return M