From 749c86557e3eb8d89bc93098d5a5ca089610278f Mon Sep 17 00:00:00 2001 From: Simon Hauser Date: Mon, 16 Nov 2020 21:48:45 +0100 Subject: [PATCH] Update attach_mappings to use new actions api (#249) --- README.md | 61 +++++++-- lua/telescope/builtin/init.lua | 233 ++++++++++++++------------------- 2 files changed, 151 insertions(+), 143 deletions(-) diff --git a/README.md b/README.md index d57e253..5a5a469 100644 --- a/README.md +++ b/README.md @@ -201,11 +201,14 @@ end [""] = test_action, -- If you want your function to run after another action you should define it as follows -local test_action = actions._transform_action(function(prompt_bufnr) - print("This function ran after another action. Prompt_bufnr: " .. prompt_bufnr) - -- Enter your function logic here. You can take inspiration from lua/telescope/actions.lua -end) -[""] = actions.goto_file_selection_split + test_action +local transform_mod = require('telescope.actions.mt').transform_mod +local test_action = transform_mod { + x = function() + print("This function ran after another action. Prompt_bufnr: " .. prompt_bufnr) + -- Enter your function logic here. You can take inspiration from lua/telescope/actions.lua + end, +} +[""] = actions.goto_file_selection_split + test_action.x ``` @@ -215,10 +218,13 @@ A full example: local actions = require('telescope.actions') -- If you want your function to run after another action you should define it as follows -local test_action = actions._transform_action(function(prompt_bufnr) - print("This function ran after another action. Prompt_bufnr: " .. prompt_bufnr) - -- Enter your function logic here. You can take inspiration from lua/telescope/actions.lua -end) +local transform_mod = require('telescope.actions.mt').transform_mod +local test_action = transform_mod { + x = function() + print("This function ran after another action. Prompt_bufnr: " .. prompt_bufnr) + -- Enter your function logic here. You can take inspiration from lua/telescope/actions.lua + end, +} require('telescope').setup { defaults = { @@ -259,6 +265,43 @@ function my_custom_picker(results) end ``` +To override a action, you have to use `attach_mappings` like this (prefered method): + +```lua +function my_custom_picker(results) + pickers.new(opts, { + prompt_title = 'Custom Picker', + finder = finders.new_table(results), + sorter = sorters.fuzzy_with_index_bias(), + attach_mappings = function(prompt_bufnr) + -- This will replace goto_file_selection_edit no mather on which key it is mapped by default + actions.goto_file_selection_edit:replace(function() + -- Code here + end) + + -- You can also enhance an action with post and post action which will run before of after an action + actions.goto_file_selection_split:enhance { + pre = function() + -- Will run before actions.goto_file_selection_split + end, + post = function() + -- Will run after actions.goto_file_selection_split + end, + } + + -- Or replace for all commands: edit, new, vnew and tab + actions._goto_file_selection:replace(function(_, cmd) + print(cmd) -- Will print edit, new, vnew or tab depending on your keystroke + end) + + return true + end, + }):find() +end +``` + +See `lua/telescope/builtin.lua` for examples on how to `attach_mappings` in the prefered way. + Additionally, the prompt's filetype will be `TelescopePrompt`. You can customize the filetype as you would normally. ## Status (Unstable API) diff --git a/lua/telescope/builtin/init.lua b/lua/telescope/builtin/init.lua index 80c1f3f..9653e0c 100644 --- a/lua/telescope/builtin/init.lua +++ b/lua/telescope/builtin/init.lua @@ -71,24 +71,20 @@ builtin.commands = function() end }, sorter = conf.generic_sorter(), - attach_mappings = function(prompt_bufnr, map) - local run_command = function() - local selection = actions.get_selected_entry(prompt_bufnr) + attach_mappings = function(prompt_bufnr) + actions.goto_file_selection_edit:replace(function() + local selection = actions.get_selected_entry() actions.close(prompt_bufnr) local val = selection.value local cmd = string.format([[:%s ]], val.name) if val.nargs == "0" then - vim.cmd(cmd) + vim.cmd(cmd) else - vim.cmd [[stopinsert]] - vim.fn.feedkeys(cmd) + vim.cmd [[stopinsert]] + vim.fn.feedkeys(cmd) end - - end - - map('i', '', run_command) - map('n', '', run_command) + end) return true end @@ -225,9 +221,9 @@ builtin.lsp_code_actions = function(opts) } end }, - attach_mappings = function(prompt_bufnr, map) - local execute = function() - local selection = actions.get_selected_entry(prompt_bufnr) + attach_mappings = function(prompt_bufnr) + actions.goto_file_selection_edit:replace(function() + local selection = actions.get_selected_entry() actions.close(prompt_bufnr) local val = selection.value @@ -241,10 +237,7 @@ builtin.lsp_code_actions = function(opts) else vim.lsp.buf.execute_command(val) end - end - - map('i', '', execute) - map('n', '', execute) + end) return true end, @@ -398,63 +391,59 @@ builtin.vim_options = function(opts) local vim_opts = loadfile(utils.data_directory() .. path.separator .. 'options' .. path.separator .. 'options.lua')().options pickers.new(opts, { - prompt = 'options', - finder = finders.new_table { - results = vim_opts, - entry_maker = make_entry.gen_from_vimoptions(opts), - }, - -- TODO: previewer for Vim options - -- previewer = previewers.help.new(opts), - sorter = sorters.get_fzy_sorter(), - attach_mappings = function(prompt_bufnr, map) - local edit_option = function() - local selection = actions.get_selected_entry(prompt_bufnr) - local esc = "" + prompt = 'options', + finder = finders.new_table { + results = vim_opts, + entry_maker = make_entry.gen_from_vimoptions(opts), + }, + -- TODO: previewer for Vim options + -- previewer = previewers.help.new(opts), + sorter = sorters.get_fzy_sorter(), + attach_mappings = function(prompt_bufnr) + actions.goto_file_selection_edit:replace(function() + local selection = actions.get_selected_entry() + local esc = "" - - if vim.fn.mode() == "i" then - -- TODO: don't make this local - esc = vim.api.nvim_replace_termcodes("", true, false, true) - end - - -- TODO: Make this actually work. - - -- actions.close(prompt_bufnr) - -- vim.api.nvim_win_set_var(vim.fn.nvim_get_current_win(), "telescope", 1) - -- print(prompt_bufnr) - -- print(vim.fn.bufnr()) - -- vim.cmd([[ autocmd BufEnter ++nested ++once startinsert!]]) - -- print(vim.fn.winheight(0)) - - -- local prompt_winnr = vim.fn.getbufinfo(prompt_bufnr)[1].windows[1] - -- print(prompt_winnr) - - -- local float_opts = {} - -- float_opts.relative = "editor" - -- float_opts.anchor = "sw" - -- float_opts.focusable = false - -- float_opts.style = "minimal" - -- float_opts.row = vim.api.nvim_get_option("lines") - 2 -- TODO: include `cmdheight` and `laststatus` in this calculation - -- float_opts.col = 2 - -- float_opts.height = 10 - -- float_opts.width = string.len(selection.last_set_from)+15 - -- local buf = vim.fn.nvim_create_buf(false, true) - -- vim.fn.nvim_buf_set_lines(buf, 0, 0, false, {"default value: abcdef", "last set from: " .. selection.last_set_from}) - -- local status_win = vim.fn.nvim_open_win(buf, false, float_opts) - -- -- vim.api.nvim_win_set_option(status_win, "winblend", 100) - -- vim.api.nvim_win_set_option(status_win, "winhl", "Normal:PmenuSel") - -- -- vim.api.nvim_set_current_win(status_win) - -- vim.cmd[[redraw!]] - -- vim.cmd("autocmd CmdLineLeave : ++once echom 'beep'") - vim.api.nvim_feedkeys(string.format("%s:set %s=%s", esc, selection.name, selection.current_value), "m", true) + if vim.fn.mode() == "i" then + -- TODO: don't make this local + esc = vim.api.nvim_replace_termcodes("", true, false, true) end - map('i', '', edit_option) - map('n', '', edit_option) + -- TODO: Make this actually work. - return true - end - }):find() + -- actions.close(prompt_bufnr) + -- vim.api.nvim_win_set_var(vim.fn.nvim_get_current_win(), "telescope", 1) + -- print(prompt_bufnr) + -- print(vim.fn.bufnr()) + -- vim.cmd([[ autocmd BufEnter ++nested ++once startinsert!]]) + -- print(vim.fn.winheight(0)) + + -- local prompt_winnr = vim.fn.getbufinfo(prompt_bufnr)[1].windows[1] + -- print(prompt_winnr) + + -- local float_opts = {} + -- float_opts.relative = "editor" + -- float_opts.anchor = "sw" + -- float_opts.focusable = false + -- float_opts.style = "minimal" + -- float_opts.row = vim.api.nvim_get_option("lines") - 2 -- TODO: include `cmdheight` and `laststatus` in this calculation + -- float_opts.col = 2 + -- float_opts.height = 10 + -- float_opts.width = string.len(selection.last_set_from)+15 + -- local buf = vim.fn.nvim_create_buf(false, true) + -- vim.fn.nvim_buf_set_lines(buf, 0, 0, false, {"default value: abcdef", "last set from: " .. selection.last_set_from}) + -- local status_win = vim.fn.nvim_open_win(buf, false, float_opts) + -- -- vim.api.nvim_win_set_option(status_win, "winblend", 100) + -- vim.api.nvim_win_set_option(status_win, "winhl", "Normal:PmenuSel") + -- -- vim.api.nvim_set_current_win(status_win) + -- vim.cmd[[redraw!]] + -- vim.cmd("autocmd CmdLineLeave : ++once echom 'beep'") + vim.api.nvim_feedkeys(string.format("%s:set %s=%s", esc, selection.name, selection.current_value), "m", true) + end) + + return true + end + }):find() end builtin.help_tags = function(opts) @@ -478,37 +467,18 @@ builtin.help_tags = function(opts) -- TODO: previewer for Vim help previewer = previewers.help.new(opts), sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr, map) - local open = function(cmd) - local selection = actions.get_selected_entry(prompt_bufnr) - + attach_mappings = function(prompt_bufnr) + actions._goto_file_selection:replace(function(_, cmd) + local selection = actions.get_selected_entry() actions.close(prompt_bufnr) - vim.cmd(cmd .. selection.value) - end - local nhelp = function() - return open("help ") - end - local vhelp = function() - return open("vert bo help ") - end - local hhelp = function() - return open("help ") - -- Not sure how explictly make horizontal - end - local thelp = function() - return open("tab help ") - end - -- Perhaps it would be a good idea to have vsplit,tab,hsplit open - -- a builtin action that accepts a command to be ran before creating - -- the split or tab - map('i', '', nhelp) - map('n', '', nhelp) - map('i', '', vhelp) - map('n', '', vhelp) - map('i', '', hhelp) - map('n', '', hhelp) - map('i', '', thelp) - map('n', '', thelp) + if cmd == 'edit' or cmd == 'new' then + vim.cmd('help ' .. selection.value) + elseif cmd == 'vnew' then + vim.cmd('vert bo help ' .. selection.value) + elseif cmd == 'tabedit' then + vim.cmd('tab help ' .. selection.value) + end + end) return true end @@ -538,17 +508,14 @@ builtin.reloader = function(opts) -- previewer = previewers.vim_buffer.new(opts), sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr, map) - local reload_package = function() - local selection = actions.get_selected_entry(prompt_bufnr) + attach_mappings = function(prompt_bufnr) + actions.goto_file_selection_edit:replace(function() + local selection = actions.get_selected_entry() actions.close(prompt_bufnr) require('plenary.reload').reload_module(selection.value) print(string.format("[%s] - module reloaded", selection.value)) - end - - map('i', '', reload_package) - map('n', '', reload_package) + end) return true end @@ -587,8 +554,8 @@ builtin.builtin = function(opts) }, previewer = previewers.qflist.new(opts), sorter = conf.generic_sorter(opts), - attach_mappings = function(_, map) - map('i', '', actions.run_builtin) + attach_mappings = function(_) + actions.goto_file_selection_edit:replace(actions.run_builtin) return true end }):find() @@ -758,9 +725,9 @@ builtin.planets = function(opts) }, previewer = previewers.cat.new(opts), sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr, map) - map('i', '', function() - local selection = actions.get_selected_entry(prompt_bufnr) + attach_mappings = function(prompt_bufnr) + actions.goto_file_selection_edit:replace(function() + local selection = actions.get_selected_entry() actions.close(prompt_bufnr) print("Enjoy astronomy! You viewed:", selection.display) @@ -795,12 +762,12 @@ builtin.current_buffer_fuzzy_find = function(opts) end }, sorter = sorters.get_generic_fuzzy_sorter(), - attach_mappings = function(prompt_bufnr) + attach_mappings = function() actions._goto_file_selection:enhance { - post = vim.schedule_wrap(function() - local selection = actions.get_selected_entry(prompt_bufnr) + post = function() + local selection = actions.get_selected_entry() vim.api.nvim_win_set_cursor(0, {selection.lnum, 0}) - end), + end, } return true @@ -828,17 +795,19 @@ builtin.man_pages = function(opts) }, previewer = previewers.man.new(opts), sorter = sorters.get_generic_fuzzy_sorter(), - attach_mappings = function(prompt_bufnr, map) - local view_manpage = function() - local selection = actions.get_selected_entry(prompt_bufnr) + attach_mappings = function(prompt_bufnr) + actions._goto_file_selection:replace(function(_, cmd) + local selection = actions.get_selected_entry() actions.close(prompt_bufnr) - print(vim.inspect(selection.value)) - vim.cmd("Man " .. selection.value) - end - - map('i', '', view_manpage) - map('n', '', view_manpage) + if cmd == 'edit' or cmd == 'new' then + vim.cmd('Man ' .. selection.value) + elseif cmd == 'vnew' then + vim.cmd('vert bo Man ' .. selection.value) + elseif cmd == 'tabedit' then + vim.cmd('tab Man ' .. selection.value) + end + end) return true end @@ -857,17 +826,13 @@ builtin.colorscheme = function(opts) }, -- TODO: better preview? sorter = sorters.get_generic_fuzzy_sorter(), - attach_mappings = function(prompt_bufnr, map) - local change_colorscheme = function() - local selection = actions.get_selected_entry(prompt_bufnr) + attach_mappings = function(prompt_bufnr) + actions.goto_file_selection_edit:replace(function() + local selection = actions.get_selected_entry() actions.close(prompt_bufnr) - print(vim.inspect(selection.value)) vim.cmd("colorscheme " .. selection.value) - end - - map('i', '', change_colorscheme) - map('n', '', change_colorscheme) + end) return true end