diff options
| author | Simon Hauser <Simon-Hauser@outlook.de> | 2020-12-31 16:17:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-31 16:17:09 +0100 |
| commit | a0b37473a924083386118c8467717843cfb6b0cb (patch) | |
| tree | 68fdbd952bc15a0c1f70c9073d7d620d5ee76c32 /lua | |
| parent | 686d560fa50e130801d5bd64493d79f1c65e3f7c (diff) | |
fix: tags now work with hasktags (#375)
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/telescope/builtin/files.lua | 24 | ||||
| -rw-r--r-- | lua/telescope/make_entry.lua | 10 | ||||
| -rw-r--r-- | lua/telescope/previewers/buffer_previewer.lua | 42 |
3 files changed, 52 insertions, 24 deletions
diff --git a/lua/telescope/builtin/files.lua b/lua/telescope/builtin/files.lua index 35858c3..35e68be 100644 --- a/lua/telescope/builtin/files.lua +++ b/lua/telescope/builtin/files.lua @@ -224,12 +224,12 @@ end files.tags = function(opts) local ctags_file = opts.ctags_file or 'tags' - if not vim.loop.fs_open(vim.fn.expand(ctags_file), "r", 438) then + if not vim.loop.fs_open(vim.fn.expand(ctags_file, true), "r", 438) then print('Tags file does not exists. Create one with ctags -R') return end - local fd = assert(vim.loop.fs_open(vim.fn.expand(ctags_file), "r", 438)) + local fd = assert(vim.loop.fs_open(vim.fn.expand(ctags_file, true), "r", 438)) local stat = assert(vim.loop.fs_fstat(fd)) local data = assert(vim.loop.fs_read(fd, stat.size, 0)) assert(vim.loop.fs_close(fd)) @@ -249,14 +249,18 @@ files.tags = function(opts) post = function() local selection = actions.get_selected_entry() - local scode = string.gsub(selection.scode, '[$]$', '') - scode = string.gsub(scode, [[\\]], [[\]]) - scode = string.gsub(scode, [[\/]], [[/]]) - scode = string.gsub(scode, '[*]', [[\*]]) - - vim.cmd('norm! gg') - vim.fn.search(scode) - vim.cmd('norm! zz') + if selection.scode then + local scode = string.gsub(selection.scode, '[$]$', '') + scode = string.gsub(scode, [[\\]], [[\]]) + scode = string.gsub(scode, [[\/]], [[/]]) + scode = string.gsub(scode, '[*]', [[\*]]) + + vim.cmd('norm! gg') + vim.fn.search(scode) + vim.cmd('norm! zz') + else + vim.api.nvim_win_set_cursor(0, {selection.lnum, 0}) + end end, } return true diff --git a/lua/telescope/make_entry.lua b/lua/telescope/make_entry.lua index c1a4f66..d653f9e 100644 --- a/lua/telescope/make_entry.lua +++ b/lua/telescope/make_entry.lua @@ -834,7 +834,13 @@ function make_entry.gen_from_ctags(opts) return nil end - local tag, file, scode = string.match(line, '([^\t]+)\t([^\t]+)\t/^\t?(.*)/;"\t+.*') + local tag, file, scode, lnum + -- ctags gives us: 'tags\tfile\tsource' + tag, file, scode = string.match(line, '([^\t]+)\t([^\t]+)\t/^\t?(.*)/;"\t+.*') + if not tag then + -- hasktags gives us: 'tags\tfile\tlnum' + tag, file, lnum = string.match(line, '([^\t]+)\t([^\t]+)\t(%d+).*') + end if opts.only_current_file and file ~= current_file then return nil @@ -851,7 +857,7 @@ function make_entry.gen_from_ctags(opts) filename = file, col = 1, - lnum = 1, + lnum = lnum and tonumber(lnum) or 1, } end end diff --git a/lua/telescope/previewers/buffer_previewer.lua b/lua/telescope/previewers/buffer_previewer.lua index 64cb5d5..354bca0 100644 --- a/lua/telescope/previewers/buffer_previewer.lua +++ b/lua/telescope/previewers/buffer_previewer.lua @@ -222,11 +222,40 @@ end, {}) previewers.qflist = previewers.vimgrep previewers.ctags = defaulter(function(_) + local determine_jump = function(entry) + if entry.scode then + return function(self) + local scode = string.gsub(entry.scode, '[$]$', '') + scode = string.gsub(scode, [[\\]], [[\]]) + scode = string.gsub(scode, [[\/]], [[/]]) + scode = string.gsub(scode, '[*]', [[\*]]) + + pcall(vim.fn.matchdelete, self.state.hl_id, self.state.winid) + vim.cmd "norm! gg" + vim.fn.search(scode, "W") + vim.cmd "norm! zz" + + self.state.hl_id = vim.fn.matchadd('TelescopePreviewMatch', scode) + end + else + return function(self, bufnr) + if self.state.last_set_bufnr then + pcall(vim.api.nvim_buf_clear_namespace, self.state.last_set_bufnr, ns_previewer, 0, -1) + end + pcall(vim.api.nvim_buf_add_highlight, bufnr, ns_previewer, "TelescopePreviewMatch", entry.lnum - 1, 0, -1) + pcall(vim.api.nvim_win_set_cursor, self.state.winid, { entry.lnum, 0 }) + self.state.last_set_bufnr = bufnr + end + end + end + return previewers.new_buffer_previewer { teardown = function(self) if self.state and self.state.hl_id then pcall(vim.fn.matchdelete, self.state.hl_id, self.state.hl_win) self.state.hl_id = nil + elseif self.state and self.state.last_set_bufnr and vim.api.nvim_buf_is_valid(self.state.last_set_bufnr) then + vim.api.nvim_buf_clear_namespace(self.state.last_set_bufnr, ns_previewer, 0, -1) end end, @@ -236,22 +265,11 @@ previewers.ctags = defaulter(function(_) define_preview = function(self, entry, status) putils.with_preview_window(status, nil, function() - local scode = string.gsub(entry.scode, '[$]$', '') - scode = string.gsub(scode, [[\\]], [[\]]) - scode = string.gsub(scode, [[\/]], [[/]]) - scode = string.gsub(scode, '[*]', [[\*]]) - conf.buffer_previewer_maker(entry.filename, self.state.bufnr, self.state.bufname, true, function(bufnr) vim.api.nvim_buf_call(bufnr, function() - pcall(vim.fn.matchdelete, self.state.hl_id, self.state.winid) - vim.cmd "norm! gg" - vim.fn.search(scode, "W") - vim.cmd "norm! zz" - - self.state.hl_id = vim.fn.matchadd('TelescopePreviewMatch', scode) + determine_jump(entry)(self, bufnr) end) end) - end) end } |
