summaryrefslogtreecommitdiff
path: root/lua/dropship.lua
blob: 0a5528a80646a2debb40dc0405764c5ace620645 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
local M = {}

local pickers = require("telescope.pickers")
local finders = require("telescope.finders")
local conf = require("telescope.config").values
local actions = require("telescope.actions")
local action_state = require("telescope.actions.state")

local drop_sites = {}

M.setup = function(opts)
  opts = opts or {}
  if type(opts.drop_sites) == "table" then
    drop_sites = opts.drop_sites
  elseif type(opts.drop_sites) == "string" then
    local success, loaded_sites = pcall(function()
      return dofile(vim.fn.expand(opts.drop_sites))
    end)
    if success and type(loaded_sites) == "table" then
      drop_sites = loaded_sites
    else
      vim.notify("Failed to load drop_sites from file: " .. opts.drop_sites, vim.log.levels.ERROR)
    end
  else
    vim.notify("Invalid drop_sites configuration", vim.log.levels.ERROR)
  end
end

local function get_target(opts, callback)
  opts = opts or {}
  pickers
    .new(opts, {
      finder = finders.new_table({
        results = drop_sites,
        entry_maker = function(entry)
          return {
            value = entry,
            display = entry.name .. ": " .. entry.dir,
            ordinal = entry.name,
          }
        end,
      }),
      sorter = conf.generic_sorter(opts),
      attach_mappings = function(bufnr)
        actions.select_default:replace(function()
          actions.close(bufnr)
          local selection = action_state.get_selected_entry()
          callback(selection.value.dir)
        end)
        return true
      end,
    })
    :find()
end

M.current_tab = function(opts)
  opts = opts or {}
  get_target(opts, function(target)
    vim.cmd("tcd " .. target)
  end)
end

M.new_tab = function(opts)
  opts = opts or {}
  get_target(opts, function(target)
    vim.cmd("tabnew " .. target)
    vim.cmd("tcd " .. target)
  end)
end

M.globally = function(opts)
  opts = opts or {}
  get_target(opts, function(target)
    vim.cmd("cd " .. target)
  end)
end

return M