diff options
| author | TJ DeVries <devries.timothyj@gmail.com> | 2020-09-02 00:06:03 -0400 |
|---|---|---|
| committer | TJ DeVries <devries.timothyj@gmail.com> | 2020-09-02 00:06:07 -0400 |
| commit | 061307233cdff0a90504117dd48e4fec3a10443a (patch) | |
| tree | d71cd84a3eb93fda55284b22be3eb610aaced13a /lua | |
| parent | 9f906f03922907b95b71a8f57254e64ba9c76ce8 (diff) | |
feat: add some new items and make mappings easier
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/telescope/actions.lua | 18 | ||||
| -rw-r--r-- | lua/telescope/builtin.lua | 46 | ||||
| -rw-r--r-- | lua/telescope/finders.lua | 18 | ||||
| -rw-r--r-- | lua/telescope/mappings.lua | 104 | ||||
| -rw-r--r-- | lua/telescope/pickers.lua | 18 | ||||
| -rw-r--r-- | lua/telescope/previewers.lua | 4 |
6 files changed, 165 insertions, 43 deletions
diff --git a/lua/telescope/actions.lua b/lua/telescope/actions.lua index abd5bf8..f1b4a38 100644 --- a/lua/telescope/actions.lua +++ b/lua/telescope/actions.lua @@ -78,5 +78,23 @@ actions.close = function(prompt_bufnr) vim.cmd(string.format([[bwipeout! %s]], prompt_bufnr)) end +actions.set_command_line = function(prompt_bufnr) + local entry = actions.get_selected_entry(prompt_bufnr) + + actions.close(prompt_bufnr) + + vim.cmd(entry.value) +end + +-- TODO: Think about how to do this. +actions.insert_value = function(prompt_bufnr) + local entry = actions.get_selected_entry(prompt_bufnr) + + vim.schedule(function() + actions.close(prompt_bufnr) + end) + + return entry.value +end return actions diff --git a/lua/telescope/builtin.lua b/lua/telescope/builtin.lua index 42156f6..afc104c 100644 --- a/lua/telescope/builtin.lua +++ b/lua/telescope/builtin.lua @@ -2,8 +2,16 @@ A collection of builtin pipelines for telesceope. Meant for both example and for easy startup. + +Any of these functions can just be called directly by doing: + +:lua require('telescope.builtin').__name__() + +This will use the default configuration options. + Other configuration options still in flux at the moment --]] +local actions = require('telescope.actions') local finders = require('telescope.finders') local previewers = require('telescope.previewers') local pickers = require('telescope.pickers') @@ -36,14 +44,11 @@ builtin.git_files = function(opts) previewer = previewers.cat, sorter = sorters.get_fuzzy_file(), }):find() - end builtin.live_grep = function(opts) local live_grepper = finders.new { - maximum_results = 1000, - - fn_command = function(self, prompt) + fn_command = function(_, prompt) -- TODO: Make it so that we can start searching on the first character. if not prompt or prompt == "" then return nil @@ -186,7 +191,7 @@ builtin.command_history = function(opts) local results = {} for i = 3, #history_list do local item = history_list[i] - local start, finish = string.find(item, "%d+ +") + local _, finish = string.find(item, "%d+ +") table.insert(results, string.sub(item, finish + 1)) end @@ -195,6 +200,15 @@ builtin.command_history = function(opts) finder = finders.new_table(results), sorter = sorters.get_norcalli_sorter(), + attach_mappings = function(map) + map('i', '<CR>', actions.set_command_line) + + -- TODO: Find a way to insert the text... it seems hard. + -- map('i', '<C-i>', actions.insert_value, { expr = true }) + + return true + end, + -- TODO: Adapt `help` to this. -- previewer = previewers.cat, }):find() @@ -230,4 +244,26 @@ builtin.builtin = function(opts) }):find() end + +builtin.fd = function(opts) + local fd_string = nil + if 1 == vim.fn.executable("fd") then + fd_string = "fd" + elseif 1 == vim.fn.executable("fdfind") then + fd_string = "fdfind" + end + + if not fd_string then + print("You need to install fd") + return + end + + pickers.new(opts, { + prompt = 'Find Files', + finder = finders.new_oneshot_job {fd_string}, + previewer = previewers.cat, + sorter = sorters.get_fuzzy_file(), + }):find() +end + return builtin diff --git a/lua/telescope/finders.lua b/lua/telescope/finders.lua index b3c5022..56b823b 100644 --- a/lua/telescope/finders.lua +++ b/lua/telescope/finders.lua @@ -155,6 +155,24 @@ end -- } -- end +finders.new_job = function(command_generator) + return finders.new { + fn_command = function(_, prompt) + local command_list = command_generator(prompt) + if command_list == nil then + return nil + end + + local command = table.remove(command_list, 1) + + return { + command = command, + args = command_list, + } + end + } +end + finders.new_oneshot_job = function(command_list, entry_maker) command_list = vim.deepcopy(command_list) diff --git a/lua/telescope/mappings.lua b/lua/telescope/mappings.lua index ba618d4..6c8641c 100644 --- a/lua/telescope/mappings.lua +++ b/lua/telescope/mappings.lua @@ -29,14 +29,14 @@ end --[[ Usage: -mappings.apply_keymap(42, { +mappings.apply_keymap(42, <function>, { n = { ["<leader>x"] = "just do this string", ["<CR>"] = function(picker, prompt_bufnr) actions.close_prompt() - local filename = ... +> local filename = ... vim.cmd(string.format(":e %s", filename)) end, }, @@ -45,41 +45,75 @@ mappings.apply_keymap(42, { } }) --]] -mappings.apply_keymap = function(prompt_bufnr, buffer_keymap) +local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts) + opts = opts or { + silent = true + } + + if type(key_func) == "string" then + a.nvim_buf_set_keymap( + prompt_bufnr, + mode, + key_bind, + key_func, + opts or { + silent = true + } + ) + else + local key_id = assign_function(prompt_bufnr, key_func) + local prefix = "" + + local map_string + if opts.expr then + map_string = string.format( + [[luaeval("require('telescope.mappings').execute_keymap(%s, %s)")]], + prompt_bufnr, + key_id + ) + else + if mode == "i" and not opts.expr then + prefix = "<C-O>" + end + + map_string = string.format( + "%s:lua require('telescope.mappings').execute_keymap(%s, %s)<CR>", + prefix, + prompt_bufnr, + key_id + ) + end + + a.nvim_buf_set_keymap( + prompt_bufnr, + mode, + key_bind, + map_string, + opts + ) + end +end + +mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap) + local applied_mappings = { n = {}, i = {} } + + local map = function(mode, key_bind, key_func, opts) + applied_mappings[mode][key_bind] = true + + telescope_map(prompt_bufnr, mode, key_bind, key_func, opts) + end + + if attach_mappings and not attach_mappings(map) then + return + end + for mode, mode_map in pairs(buffer_keymap) do - for key_bind, key_func in pairs(mode_map) do - if type(key_func) == "string" then - a.nvim_buf_set_keymap( - prompt_bufnr, - mode, - key_bind, - key_func, - { - silent = true - } - ) - else - local key_id = assign_function(prompt_bufnr, key_func) - local prefix = "" - if mode == "i" then - prefix = "<C-O>" - end - - a.nvim_buf_set_keymap( - prompt_bufnr, - mode, - key_bind, - string.format( - "%s:lua require('telescope.mappings').execute_keymap(%s, %s)<CR>", - prefix, - prompt_bufnr, - key_id - ), - { - silent = true - } - ) + -- TODO: Probalby should not overwrite any keymaps + -- local buffer_keymaps + for key_bind, key_func in pairs(mode_map) do + if not applied_mappings[mode][key_bind] then + telescope_map(prompt_bufnr, mode, key_bind, key_func) end end end diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua index 4b450f2..51b1162 100644 --- a/lua/telescope/pickers.lua +++ b/lua/telescope/pickers.lua @@ -14,7 +14,7 @@ local get_default = utils.get_default -- TODO: Make this work with deep extend I think. local extend = function(opts, defaults) - local result = vim.deepcopy(opts or {}) + local result = opts or {} for k, v in pairs(defaults or {}) do if result[k] == nil then result[k] = v @@ -69,7 +69,19 @@ function Picker:new(opts) sorter = opts.sorter, previewer = opts.previewer, - mappings = get_default(opts.mappings, default_mappings), + -- opts.mappings => overwrites entire table + -- opts.override_mappings => merges your table in with defaults. + -- Add option to change default + -- opts.attach(bufnr) + + --[[ + function(map) + map('n', '<esc>', actions.close, [opts]) + telescope.apply_mapping + end + --]] + -- mappings = get_default(opts.mappings, default_mappings), + attach_mappings = opts.attach_mappings, get_window_options = opts.get_window_options, selection_strategy = opts.selection_strategy, @@ -366,7 +378,7 @@ function Picker:find() finder = finder, }) - mappings.apply_keymap(prompt_bufnr, self.mappings) + mappings.apply_keymap(prompt_bufnr, self.attach_mappings, default_mappings) vim.cmd [[startinsert]] end diff --git a/lua/telescope/previewers.lua b/lua/telescope/previewers.lua index 48b3a1a..224cda0 100644 --- a/lua/telescope/previewers.lua +++ b/lua/telescope/previewers.lua @@ -10,6 +10,10 @@ Previewer.__index = Previewer local bat_options = " --style=grid --paging=always " -- --terminal-width=%s +-- TODO: We shoudl make sure that all our terminals close all the way. +-- Otherwise it could be bad if they're just sitting around, waiting to be closed. +-- I don't think that's the problem, but it could be? + function Previewer:new(opts) opts = opts or {} |
