feature: Vim help-tags picker (#117)

* feature: Vim help-tags picker

* fix: filtered results were wrong because of missing `entry.value`

* fix: filtered (Vim only help) items are listed in results as empty
entries.

* fix: avoid search history pollution by replacing / in cmd returned by taglist() with search()

* fix: improve search() formatting

* fix: escape tilde in search() command

* fix: improve help-preview

* fix: improve search()

* fix: search() string fixes.

* fix: use no magic to do magic

Co-authored-by: TJ DeVries <devries.timothyj@gmail.com>
This commit is contained in:
Senghan Bright
2020-09-25 06:16:48 +02:00
committed by GitHub
parent a38bb06e7d
commit c3f9b25606
4 changed files with 11965 additions and 11 deletions

View File

@@ -58,7 +58,7 @@ end
local previewer_ns = vim.api.nvim_create_namespace('telescope.previewers')
local with_preview_window = function(status, bufnr, callable)
if bufnr and vim.api.nvim_buf_call then
if bufnr and vim.api.nvim_buf_call and false then
vim.api.nvim_buf_call(bufnr, callable)
else
return context_manager.with(function()
@@ -365,17 +365,17 @@ previewers.qflist = defaulter(function(opts)
}
end, {})
-- WIP
previewers.help = defaulter(function(_)
return previewers.new {
preview_fn = function(_, entry, status)
with_preview_window(status, nil, function()
local old_tags = vim.o.tags
vim.o.tags = vim.fn.expand("$VIMRUNTIME") .. '/doc/tags'
local special_chars = ":~^.?/%[%]%*"
local taglist = vim.fn.taglist('^' .. entry.value .. '$')
local escaped = vim.fn.escape(entry.value, special_chars)
local tagfile = vim.fn.expand("$VIMRUNTIME") .. '/doc/tags'
local taglist = vim.fn.taglist('^' .. escaped .. '$', tagfile)
if vim.tbl_isempty(taglist) then
taglist = vim.fn.taglist(entry.value)
taglist = vim.fn.taglist(escaped, tagfile)
end
if vim.tbl_isempty(taglist) then
@@ -384,15 +384,23 @@ previewers.help = defaulter(function(_)
local best_entry = taglist[1]
local new_bufnr = vim.fn.bufnr(best_entry.filename, true)
vim.api.nvim_buf_set_option(new_bufnr, 'filetype', 'help')
vim.api.nvim_win_set_buf(status.preview_win, new_bufnr)
vim.cmd [["gg"]]
print(best_entry.cmd)
vim.cmd(string.format([[execute "%s"]], best_entry.cmd))
local search_query = best_entry.cmd
vim.o.tags = old_tags
-- remove leading '/'
search_query = search_query:sub(2)
-- Set the query to "very nomagic".
-- This should make it work quite nicely given tags.
search_query = [[\V]] .. search_query
log.trace([[lua vim.fn.search("]], search_query, [[")]])
vim.cmd "norm! gg"
vim.fn.search(search_query, "W")
vim.cmd "norm zt"
end)
end
}