diff options
| author | Senghan Bright <senghan.bright@deltaprojects.com> | 2020-09-25 06:16:48 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-25 00:16:48 -0400 |
| commit | c3f9b25606cea94bc4af55dbddf7d7d863be4517 (patch) | |
| tree | f7640ee93bb11f191ee1388aa737128b0142b062 /lua | |
| parent | a38bb06e7da233a975cbf27b897a22001c4fd206 (diff) | |
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>
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/telescope/builtin.lua | 39 | ||||
| -rw-r--r-- | lua/telescope/make_entry.lua | 49 | ||||
| -rw-r--r-- | lua/telescope/previewers.lua | 30 |
3 files changed, 107 insertions, 11 deletions
diff --git a/lua/telescope/builtin.lua b/lua/telescope/builtin.lua index 5264ca3..fced93c 100644 --- a/lua/telescope/builtin.lua +++ b/lua/telescope/builtin.lua @@ -402,6 +402,45 @@ builtin.command_history = function(opts) }):find() end +builtin.help_tags = function(opts) + opts = opts or {} + + local sourced_file = require('plenary.debug_utils').sourced_filepath() + local base_directory = vim.fn.fnamemodify(sourced_file, ":h:h:h") + local file = base_directory .. "/data/help/tags" + + local tags = {} + local f = assert(io.open(file, "rb")) + for line in f:lines() do + table.insert(tags, line) + end + f:close() + + pickers.new(opts, { + prompt = 'Help', + finder = finders.new_table { + results = tags, + entry_maker = make_entry.gen_from_tagfile(opts), + }, + -- TODO: previewer for Vim help + previewer = previewers.help.new(opts), + sorter = sorters.get_generic_fuzzy_sorter(), + attach_mappings = function(prompt_bufnr, map) + local view_help = function() + local selection = actions.get_selected_entry(prompt_bufnr) + + actions.close(prompt_bufnr) + vim.cmd("help " .. selection.value) + end + + map('i', '<CR>', view_help) + map('n', '<CR>', view_help) + + return true + end + }):find() +end + -- TODO: What the heck should we do for accepting this. -- vim.fn.setreg("+", "nnoremap $TODO :lua require('telescope.builtin').<whatever>()<CR>") -- TODO: Can we just do the names instead? diff --git a/lua/telescope/make_entry.lua b/lua/telescope/make_entry.lua index 3ec663b..4db664e 100644 --- a/lua/telescope/make_entry.lua +++ b/lua/telescope/make_entry.lua @@ -284,4 +284,53 @@ function make_entry.gen_from_treesitter(opts) end end +function make_entry.gen_from_tagfile(opts) + local help_entry, version + local delim = string.char(7) + + local make_display = function(line) + help_entry = "" + display = "" + version = "" + + line = line .. delim + for section in line:gmatch("(.-)" .. delim) do + if section:find("^vim:") == nil then + local ver = section:match("^neovim:(.*)") + if ver == nil then + help_entry = section + else + version = ver:sub(1, -2) + end + end + end + + result = {} + if version ~= "" then -- some Vim only entries are unversioned + if opts.show_version then + result.display = string.format("%s [%s]", help_entry, version) + else + result.display = help_entry + end + result.value = help_entry + end + + return result + end + + return function(line) + local entry = { + entry_type = make_entry.types.GENERIC, + + } + local d = make_display(line) + entry.valid = next(d) ~= nil + entry.display = d.display + entry.value = d.value + entry.ordinal = d.value + + return entry + end +end + return make_entry diff --git a/lua/telescope/previewers.lua b/lua/telescope/previewers.lua index f3f6261..e28adce 100644 --- a/lua/telescope/previewers.lua +++ b/lua/telescope/previewers.lua @@ -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 + + -- 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.o.tags = old_tags + vim.cmd "norm! gg" + vim.fn.search(search_query, "W") + vim.cmd "norm zt" end) end } |
