summaryrefslogtreecommitdiff
path: root/config/essentials/vis/fzf-mru.lua
blob: 6c2510d2175b2820a2d7e390a89ea1dca2eced59 (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
local module = {}
module.fzfmru_filepath = os.getenv("XDG_CACHE_HOME") .. "/vis-fzf-mru"
module.fzfmru_path = "fzf"
module.fzfmru_args = "--height=40%"
module.fzfmru_history = 20

local function read_mru()
    local mru = {}
    local f = io.open(module.fzfmru_filepath)
    if f == nil then return end
    for line in f:lines() do table.insert(mru, line) end
    f:close()

    return mru
end

local function write_mru(win)
    local file_path = win.file.path
    local mru = read_mru()

    -- check if mru data exists
    if mru == nil then mru = {} end
    -- check if we opened any file
    if file_path == nil then return end
    -- check duplicate
    if file_path == mru[1] then return end

    local f = io.open(module.fzfmru_filepath, "w+")
    if f == nil then return end

    table.insert(mru, 1, file_path)

    for i, k in ipairs(mru) do
        if i > module.fzfmru_history then break end
        if i == 1 or k ~= file_path then
            f:write(string.format("%s\n", k))
        end
    end

    f:close()
end

vis.events.subscribe(vis.events.WIN_OPEN, write_mru)

vis:command_register("fzfmru", function(argv)
    local command = "cat " .. module.fzfmru_filepath .. " | " ..
                        module.fzfmru_path .. " " .. module.fzfmru_args .. " " ..
                        table.concat(argv, " ")

    local file = io.popen(command)
    local output = file:read()
    local _, _, status = file:close()

    if status == 0 then
        vis:command(string.format("e '%s'", output))
    elseif status == 1 then
        vis:info(string.format(
                     "fzf-open: No match. Command %s exited with return value %i.",
                     command, status))
    elseif status == 2 then
        vis:info(string.format(
                     "fzf-open: Error. Command %s exited with return value %i.",
                     command, status))
    elseif status ~= 130 then
        vis:info(string.format(
                     "fzf-open: Unknown exit status %i. command %s exited with return value %i",
                     status, command, status, status))
    end

    vis:redraw()

    return true
end)

return module