telescope-orgmode.nvim/lua/telescope/_extensions/orgmode/refile_heading.lua

80 lines
2.2 KiB
Lua

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")
local state = require("telescope.state")
local utils = require("telescope-orgmode.utils")
local api = require("orgmode.api")
return function(opts)
opts = opts or {}
local closest_headline = api.current():get_closest_headline()
local function refile(prompt_bufnr)
local entry = action_state.get_selected_entry()
actions.close(prompt_bufnr)
-- Refile to the file by default
local destination = entry.value.file
-- Refile to a specific heading if is set
if entry.value.headline then
destination = entry.value.headline
end
return api.refile({
source = closest_headline,
destination = destination,
})
end
local function gen_depth_toggle(opts, prompt_bufnr)
local status = state.get_status(prompt_bufnr)
status._ot_current_depth = opts.max_depth
status._ot_next_depth = nil
if status._ot_current_depth ~= 0 then
status._ot_next_depth = 0
end
return function()
local current_picker = action_state.get_current_picker(prompt_bufnr)
local aux = status._ot_current_depth
status._ot_current_depth = status._ot_next_depth
status._ot_next_depth = aux
opts.max_depth = status._ot_current_depth
local new_finder = finders.new_table({
results = utils.get_entries(opts),
entry_maker = opts.entry_maker or utils.make_entry(opts),
})
current_picker:refresh(new_finder, opts)
end
end
pickers
.new(opts, {
-- TODO: alter prompt title when depth is 0: Refile under file, Refile
-- under Headline
prompt_title = "Refile Destination",
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(refile)
map("i", "<c-space>", gen_depth_toggle(opts, prompt_bufnr))
return true
end,
})
:find()
end