|
1 | 1 | local a = vim.api
|
2 | 2 |
|
3 |
| -local get_node = require('nvim-tree.lib').get_node_at_cursor |
4 |
| -local get_explorer = require('nvim-tree.core').get_explorer |
5 |
| - |
6 | 3 | local M = {}
|
7 | 4 |
|
8 |
| -M.is_open = false |
9 |
| -M.win = 0 |
10 |
| -M.bufnr = 0 |
11 |
| - |
12 |
| -local actions = { |
13 |
| - ['copy'] = require('nvim-tree.actions.copy-paste').copy |
14 |
| -} |
| 5 | +local function get_node() |
| 6 | + local get_node_at_cursor = require'nvim-tree.lib'.get_node_at_cursor |
| 7 | + |
| 8 | + local current_node = get_node_at_cursor() |
| 9 | + return current_node |
| 10 | +end |
15 | 11 |
|
16 |
| -M.mappings = { |
17 |
| - ['<Esc>'] = 'close_menu', |
18 |
| - ['<CR>'] = 'on_selection', |
19 |
| -} |
| 12 | +local current_popup = nil |
20 | 13 |
|
21 |
| -local ns_PopupMenu = a.nvim_create_namespace('ns_NvimTreePopupMenu') |
| 14 | +local winnr |
| 15 | +local bufnr |
22 | 16 |
|
23 |
| -local function create_buf() |
24 |
| - if vim.fn.bufexists("NvimTreePopupMenuBuf") == 1 then |
25 |
| - a.nvim_buf_delete(vim.fn.bufnr('NvimTreePopupMenuBuf'), {} ) |
26 |
| - end |
27 |
| - local buf = a.nvim_create_buf(false, true) |
28 |
| - a.nvim_buf_set_name(buf, 'NvimTreePopupMenuBuf') |
29 |
| - M.bufnr = buf |
| 17 | +function get_current_action(_winnr, _bufnr) |
| 18 | + local node = current_popup.current_node |
| 19 | + local cur_pos = a.nvim_win_get_cursor(_winnr)[1] |
| 20 | + local current_action = a.nvim_buf_get_lines(_bufnr, cur_pos -1, cur_pos, false)[1] |
30 | 21 |
|
31 |
| - return buf |
| 22 | + for _,v in pairs(require'nvim-tree.actions'.mappings) do |
| 23 | + if v.action == current_action then |
| 24 | + require'nvim-tree.actions'.keypress_funcs[current_action](current_popup.current_node) |
| 25 | + end |
| 26 | + end |
32 | 27 | end
|
33 | 28 |
|
34 |
| -function M.open_menu() |
35 |
| - if M.is_open == true then |
36 |
| - close_menu() |
37 |
| - end |
| 29 | +local function setup_mappings() |
| 30 | + -- TODO: pass mappings as arguments from setup or default |
| 31 | + a.nvim_buf_set_keymap(bufnr, 'n', '<CR>', string.format([[:lua get_current_action(%s, %s)<CR>]], winnr, bufnr), { noremap = true }) |
| 32 | + a.nvim_buf_set_keymap(bufnr, 'n', '<Esc>', [[:lua require("nvim-tree.popup-menu").close_window()<CR>]], { noremap = true } ) |
| 33 | +end |
38 | 34 |
|
39 |
| - create_buf() |
40 |
| - local win_opts = { |
41 |
| - width = 10, -- we should set this as NvimExplorer width |
42 |
| - height = 1, -- TODO: Set this as length of actions, as for now I'm not able to do it. |
| 35 | +local function setup_window(actions) |
| 36 | + local max_width = vim.fn.max(vim.tbl_map(function(n) return #n end, vim.tbl_keys(actions))) |
| 37 | + winnr = a.nvim_open_win(0, true, { |
| 38 | + col = 0, |
43 | 39 | row = 1,
|
44 |
| - col = 0, |
45 |
| - style = 'minimal', |
46 |
| - relative = 'cursor' |
47 |
| - } |
| 40 | + relative = 'cursor', |
48 | 41 |
|
49 |
| - local win_ui = a.nvim_open_win(M.bufnr, true, win_opts) |
50 |
| - M.is_open = true |
51 |
| - M.win = win_ui |
52 |
| - set_actions(actions) |
| 42 | + width = max_width + 1, |
| 43 | + height = vim.tbl_count(actions), |
| 44 | + style = 'minimal' |
| 45 | + }) |
53 | 46 |
|
54 |
| - -- TODO: Convert this to nvim lua api. |
55 |
| - -- at this time on my machine with nvim 0.7.0-dev+1328-gfb5587d2b |
56 |
| - -- keep yelling that "event" must be an array or string |
57 |
| - local au_group = a.nvim_create_augroup('NvimSelectionAuGroup', { clear = true }) |
58 |
| - vim.cmd(string.format([[ |
59 |
| - augroup NvimSelectionAuGroup |
60 |
| - au! CursorMoved <buffer=%s> :lua require('nvim-tree.popup-menu').add_hl_to_selection() |
61 |
| - augroup END |
62 |
| - ]], M.bufnr)) |
63 |
| - |
64 |
| - -- mappings on open window |
65 |
| - -- should we pass this on separate file? |
66 |
| - for k, v in pairs(M.mappings) do |
67 |
| - if v ~= nil then |
68 |
| - a.nvim_buf_set_keymap( |
69 |
| - M.bufnr, |
70 |
| - 'n', k, |
71 |
| - string.format([[:lua %s()<CR>]], v), { noremap = true, silent = true }) |
72 |
| - end |
73 |
| - end |
74 |
| - end |
| 47 | + current_popup = { |
| 48 | + winnr = winnr, |
| 49 | + bufnr = bufnr, |
| 50 | + current_node = get_node() |
| 51 | + } |
75 | 52 |
|
76 |
| -function close_menu() |
77 |
| - a.nvim_win_close(M.win, true) |
78 |
| - M.is_open = false |
| 53 | + bufnr = a.nvim_create_buf(false, true) |
| 54 | + a.nvim_buf_set_lines(bufnr, 0, -1, false, vim.tbl_keys(actions)) |
| 55 | + a.nvim_win_set_buf(winnr, bufnr) |
79 | 56 | end
|
80 | 57 |
|
81 |
| -function set_actions(tbl) |
82 |
| - a.nvim_buf_set_lines(M.bufnr, 0, 1, true, vim.tbl_keys(tbl)) |
| 58 | +function M.open_window() |
| 59 | + setup_window(M.actions) |
| 60 | + setup_mappings() |
83 | 61 | end
|
84 | 62 |
|
85 |
| -function M.add_hl_to_selection() |
86 |
| - if M.is_open == true then |
87 |
| - local row = a.nvim_win_get_cursor(M.win)[1] |
88 |
| - local sel_item = a.nvim_buf_get_lines(M.bufnr, row -1, row, {})[1] -- should we pass this as module params to let user customize action on current selected item? |
| 63 | +function M.close_window() |
| 64 | + if current_popup ~= nil then |
| 65 | + a.nvim_win_close(current_popup.winnr, { force = true }) |
| 66 | + a.nvim_buf_delete(bufnr, { force = true }) |
89 | 67 |
|
90 |
| - -- clear prev highlights |
91 |
| - a.nvim_buf_clear_namespace(M.bufnr, ns_PopupMenu, 0, -1) |
92 |
| - |
93 |
| - a.nvim_buf_add_highlight( |
94 |
| - M.bufnr, |
95 |
| - ns_PopupMenu, |
96 |
| - 'Error', |
97 |
| - row -1, |
98 |
| - 0, |
99 |
| - -1 |
100 |
| - ) |
| 68 | + current_popup = nil |
101 | 69 | end
|
102 | 70 | end
|
103 | 71 |
|
104 |
| -function on_selection() |
105 |
| - local row = a.nvim_win_get_cursor(M.win)[1] |
106 |
| - local sel_item = a.nvim_buf_get_lines(M.bufnr, row -1, row, {})[1] -- should we pass this as module params to let user customize action on current selected item? |
107 |
| - |
108 |
| - actions[sel_item](get_node()) |
109 |
| - close_menu() |
| 72 | +function M.setup(opts) |
| 73 | + M.actions = opts.menu.actions |
| 74 | + if M.actions == nil then |
| 75 | + M.actions = require("default_actions").actions |
| 76 | + end |
110 | 77 | end
|
111 | 78 |
|
112 | 79 | return M
|
0 commit comments