local config = require("inbox.config") local indexers = require("inbox.indexers") local renderers = require("inbox.renderers") local utils = require("inbox.utils") local view = require("inbox.view") local M = { buffers = {}, } function M.select() local mode = vim.api.nvim_get_mode().mode local is_visual = mode:match("^[vV]") local entries = {} if is_visual then -- This is the best way to get the visual selection at the moment -- https://github.com/neovim/neovim/pull/13896 local _, start_lnum, _, _ = unpack(vim.fn.getpos("v")) local _, end_lnum, _, _, _ = unpack(vim.fn.getcurpos()) if start_lnum > end_lnum then start_lnum, end_lnum = end_lnum, start_lnum end for i = start_lnum, end_lnum do local entry = M.get_entry_on_line(0, i) if entry then table.insert(entries, entry) end end else local entry = M.get_id_on_cursor() if entry then table.insert(entries, entry) end end end function M.open(maildir) if maildir == nil then maildir = config.default_maildir end if M.buffers[maildir] == nil or vim.api.nvim_buf_is_valid(M.buffers[maildir]) then M.buffers[maildir] = view.initialize_inbox(maildir) end vim.api.nvim_set_current_buf(M.buffers[maildir]) end function M.open_entry(id, content_type) if id == nil then id = M.get_cursor_id() if id == nil then return nil end end if M.buffers[id] == nil or vim.api.nvim_buf_is_valid(M.buffers[id]) then local maildir = utils.parse_scheme(0) if maildir == nil then return end local bufnr = view.initialize_entry(maildir, id, content_type) M.buffers[id] = bufnr end vim.api.nvim_set_current_buf(M.buffers[id]) end function M.select_part() local entry = M.get_cursor_entry() if entry == nil then return nil end vim.ui.select(entry.parts, { prompt = "Part", format_item = function(item) return item["content-type"] end, }, function(part) M.open_entry(entry.id, part) end) end function M.toggle_headers(bufnr) if bufnr == nil or bufnr == 0 then bufnr = vim.api.nvim_get_current_buf() end if vim.b[bufnr].show_all_headers then vim.b[bufnr].show_all_headers = false else vim.b[bufnr].show_all_headers = true end view.render_headers(bufnr) end ---@return inbox.Entry? entry function M.get_cursor_entry() local id = M.get_cursor_id() if id == nil then vim.notify(("Failed to get entry with id: %s"):format(id), vim.log.levels.ERROR) return nil end return M.indexer.get_entry(id) end ---@return string? id function M.get_cursor_id() local lnum = vim.api.nvim_win_get_cursor(0)[1] local id = vim.b[0].inbox_ids[lnum] if id == nil then vim.notify("Failed to get entry under cursor", vim.log.levels.ERROR) return nil end return id end ---@param opts inbox.Config function M.setup(opts) config.setup(opts) indexers.setup(config) renderers.setup(config) for sign, value in pairs(config.flags) do local name = utils.sign_name(sign) vim.fn.sign_define(name, value) end M.augroup = vim.api.nvim_create_augroup("Inbox", { clear = true }) end return M