diff --git a/README.md b/README.md index e69d383..8880e82 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Refile heading from capture or current file under destination with `:Telescope o vim.keymap.set("n", "r", require("telescope").extensions.orgmode.refile_heading) vim.keymap.set("n", "fh", require("telescope").extensions.orgmode.search_headings) + vim.keymap.set("n", "li", require("telescope").extensions.orgmode.insert_link) end, } ``` @@ -58,6 +59,7 @@ vim.api.nvim_create_autocmd('FileType', { ```viml :Telescope orgmode search_headings :Telescope orgmode refile_heading +:Telescope orgmode insert_link ``` ## Available functions @@ -65,4 +67,5 @@ vim.api.nvim_create_autocmd('FileType', { ```lua require('telescope').extensions.orgmode.search_headings require('telescope').extensions.orgmode.refile_heading +require('telescope').extensions.orgmode.insert_link ``` diff --git a/lua/telescope-orgmode/init.lua b/lua/telescope-orgmode/init.lua index d52f758..bea0e41 100644 --- a/lua/telescope-orgmode/init.lua +++ b/lua/telescope-orgmode/init.lua @@ -1,4 +1,5 @@ return { refile_heading = require('telescope-orgmode.refile_heading'), search_headings = require('telescope-orgmode.search_headings'), + insert_link = require('telescope-orgmode.insert_link'), } diff --git a/lua/telescope-orgmode/insert_link.lua b/lua/telescope-orgmode/insert_link.lua new file mode 100644 index 0000000..f15775c --- /dev/null +++ b/lua/telescope-orgmode/insert_link.lua @@ -0,0 +1,60 @@ +local pickers = require('telescope.pickers') +local finders = require('telescope.finders') +local conf = require('telescope.config').values +local action_set = require('telescope.actions.set') +local actions = require('telescope.actions') +local action_state = require('telescope.actions.state') + +---@type OrgApi +local OrgApi = require('orgmode.api') + +local utils = require('telescope-orgmode.utils') + +---@class MatchEntry +---@field value OrgEntry +---@field ordinal string +---@field filename string +---@field lnum number +---@field display function +---@field location string, +---@field line string, + +local function insert(prompt_bufnr) + actions.close(prompt_bufnr) + + ---@type MatchEntry + local entry = action_state.get_selected_entry() + + -- Link to the filename by default + local destination = entry.value.file.filename + + -- Link to a specific heading if is set + if entry.value.headline then + destination = 'file:' .. entry.value.file.filename .. '::*' .. entry.value.headline.title + end + + --print(vim.inspect(destination)) + OrgApi.insert_link(destination) + return true +end + +return function(opts) + opts = opts or {} + + pickers + .new(opts, { + prompt_title = 'Link Target', + finder = finders.new_table({ + results = utils.get_entries(opts), + entry_maker = opts.entry_maker or utils.make_entry(opts), + }), + sorter = conf.generic_sorter(opts), + previewer = conf.grep_previewer(opts), + attach_mappings = function(prompt_bufnr, map) + action_set.select:replace(insert) + map('i', '', utils.gen_depth_toggle(opts, prompt_bufnr)) + return true + end, + }) + :find() +end diff --git a/lua/telescope/_extensions/orgmode/init.lua b/lua/telescope/_extensions/orgmode/init.lua index 70c47ef..d8103e8 100644 --- a/lua/telescope/_extensions/orgmode/init.lua +++ b/lua/telescope/_extensions/orgmode/init.lua @@ -6,5 +6,6 @@ return require('telescope').register_extension({ exports = { search_headings = require('telescope-orgmode').search_headings, refile_heading = require('telescope-orgmode').refile_heading, + insert_link = require('telescope-orgmode').insert_link, }, })