summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorSimon Hauser <Simon-Hauser@outlook.de>2020-12-31 16:17:09 +0100
committerGitHub <noreply@github.com>2020-12-31 16:17:09 +0100
commita0b37473a924083386118c8467717843cfb6b0cb (patch)
tree68fdbd952bc15a0c1f70c9073d7d620d5ee76c32 /lua
parent686d560fa50e130801d5bd64493d79f1c65e3f7c (diff)
fix: tags now work with hasktags (#375)
Diffstat (limited to 'lua')
-rw-r--r--lua/telescope/builtin/files.lua24
-rw-r--r--lua/telescope/make_entry.lua10
-rw-r--r--lua/telescope/previewers/buffer_previewer.lua42
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
}