neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim
Log | Files | Refs

references.lua (2482B)


      1 local M = {}
      2 
      3 local function filter_curr_file(bufnr, items)
      4   local curr_filename = vim.api.nvim_buf_get_name(bufnr)
      5   return vim.tbl_filter(function(item)
      6     return item.filename == curr_filename
      7   end, items)
      8 end
      9 
     10 local function filter_before_line(bufnr, items)
     11   local curr_filename = vim.api.nvim_buf_get_name(bufnr)
     12   local curr_lnum = vim.fn.getcurpos()[2]
     13   return vim.tbl_filter(function(item)
     14     return item.filename == curr_filename and item.lnum < curr_lnum
     15   end, items)
     16 end
     17 
     18 local function filter_after_line(bufnr, items)
     19   local curr_filename = vim.api.nvim_buf_get_name(bufnr)
     20   local curr_lnum = vim.fn.getcurpos()[2]
     21   return vim.tbl_filter(function(item)
     22     return item.filename == curr_filename and item.lnum > curr_lnum
     23   end, items)
     24 end
     25 
     26 function M.after_line(opts)
     27   opts.items = filter_after_line(opts.context.bufnr, opts.items)
     28 
     29   if #opts.items == 0 then
     30     vim.notify('No references after current line')
     31     return
     32   end
     33 
     34   opts.title = 'References (After Current Line)'
     35   vim.fn.setloclist(0, {}, ' ', opts)
     36   vim.cmd.lopen()
     37 end
     38 
     39 function M.curr_file(opts)
     40   opts.items = filter_curr_file(opts.context.bufnr, opts.items)
     41 
     42   if #opts.items == 0 then
     43     vim.notify('No references in current file')
     44     return
     45   end
     46 
     47   opts.title = 'Local References'
     48   vim.fn.setloclist(0, {}, ' ', opts)
     49   vim.cmd.lopen()
     50 end
     51 
     52 function M.first_in_file(opts)
     53   opts.items = filter_curr_file(opts.context.bufnr, opts.items)
     54 
     55   if #opts.items == 0 then
     56     vim.notify('No References')
     57     return
     58   end
     59 
     60   local client = assert(vim.lsp.get_client_by_id(opts.context.client_id))
     61   vim.lsp.util.show_document(opts.items[1].user_data, client.offset_encoding, { focus = true })
     62 
     63   opts.title = 'Local References'
     64   vim.fn.setloclist(0, {}, ' ', opts)
     65 end
     66 
     67 function M.next(opts)
     68   opts.items = filter_after_line(opts.context.bufnr, opts.items)
     69 
     70   if #opts.items == 0 then
     71     vim.notify('No Following References')
     72     return
     73   end
     74 
     75   local client = assert(vim.lsp.get_client_by_id(opts.context.client_id))
     76   vim.lsp.util.show_document(opts.items[1].user_data, client.offset_encoding, { focus = true })
     77 end
     78 
     79 function M.prev(opts)
     80   opts.items = filter_before_line(opts.context.bufnr, opts.items)
     81 
     82   if #opts.items == 0 then
     83     vim.notify('No Previous References')
     84     return
     85   end
     86 
     87   local client = assert(vim.lsp.get_client_by_id(opts.context.client_id))
     88   vim.lsp.util.show_document(opts.items[#opts.items].user_data, client.offset_encoding, { focun = true })
     89 end
     90 
     91 return M