aboutsummaryrefslogtreecommitdiff
path: root/lua/denote-fzf-lua.lua
blob: 1013afb3c01523da7a0e75126b6097139b1f0c15 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
local M = {}

local config = require("denote-fzf-lua.config")
local fzflua = require('fzf-lua')


--- Check for dependencies and optional dependencies
function M.has_prereqs()
  if vim.fn.executable('fzf') ~= 1 then return "no" end
  if vim.fn.executable('rg')  ~= 1 then return "no" end
  if vim.fn.executable('fd')  ~= 1 then return "partial" end
  if vim.fn.executable('sd')  ~= 1 then return "partial" end
  if vim.fn.executable('xsv') ~= 1 then return "partial" end
  return "yes"
end

---Returns the full path of the appropriate script
function M.get_script_path()
  local lua_file_path = debug.getinfo(1, "S").source:sub(2)
  local lua_file_dir = vim.fn.fnamemodify(lua_file_path, ":h")
  local script_path = lua_file_dir .. "/denote-fzf-lua/scripts/"
  local dependencies = M.has_prereqs()
  if dependencies == "yes" then
    script_path = script_path .. "search_files.sh"
  elseif dependencies == "partial" then
    script_path = script_path .. "fallback_search_files.sh"
  else
    error("Missing dependencies: fzf and rg")
    return false
  end
  return script_path
end

---@param options table of user options
---Format the --with-nth argument for fzf (which fields are shown)
function M.format_fzf_with_nth(options)
  local fzf_with_nth = ""
  local fields = {"path", "date", "time", "sig", "title", "tags", "ext" }
  for i, v in ipairs(fields) do
      if options.fzf.search_fields[v] then
          fzf_with_nth = fzf_with_nth .. i .. ','
      end
  end
  return fzf_with_nth:sub(1, -2)
end

-- TODO: This is absolutely wrecked
function M.open_file(filename)
  local t = {}
  filename = filename:gsub("%s%s+", "|")
  t.path, t.year, t.month, t.day, t.hour, t.min, t.sec, t.sig, t.title, t.tags, t.ext =
    filename:match("^(.*/)|(%d%d%d%d)%-(%d%d)%-(%d%d)|(%d%d):(%d%d):(%d%d)|([^|]+)|([^|]+)|([^|]+)|(%..+)")
  if t.sig   == "." then
    t.sig   = ""
  else
    t.sig = "==" .. t.sig:gsub("%s", "=")
  end
  if t.title == "." then
    t.title = ""
  else
    t.title = "--" .. t.title:gsub("%s", "-")
  end
  if t.tags  == "." then
    t.tags  = ""
  else
    t.tags = "__" .. t.tags:gsub("%s", "_")
  end
  local file = t.path .. t.year .. t.month .. t.day .. "T" .. t.hour .. t.min .. t.sec .. t.sig .. t.title .. t.tags .. t.ext
  vim.api.nvim_command('edit ' .. file)
end

---@param options table of user options
---Opens a window to search filenames
function M.files(options)
  local script_path = M.get_script_path()
  if not script_path then return end
  options.fzf.opts["--with-nth"] = M.format_fzf_with_nth(options)
  fzflua.fzf_exec(script_path .. " " .. options.dir, 
    {
      preview = options.fzf.preview,
      actions = options.fzf.actions,
      fzf_opts = options.fzf.opts,
    })
  -- local fzf_args = M.format_fzf_with_nth(options) .. " " .. options.fzf.args
  -- vim.api.nvim_command('edit ' .. stdout)
end

---@param options table of user options
function M.load_cmd(options)
  vim.api.nvim_create_user_command("DenoteSearch", function(opts)
    if opts.fargs[1] == "files" then
      M.files(options)
    elseif opts.fargs[1] == "contents" then
      M.conents(options)
    else
      error("Unsupported operation " .. opts.fargs[1])
    end
  end, {
    nargs = 1,
    complete = function()
      return {"files", "contents"}
    end,
  })
end

---@param options? table user configuration
function M.setup(options)
  config.options = vim.tbl_deep_extend("force", config.defaults, options or {})
  M.load_cmd(config.options)
end

return M