From 8d535ad186334e3900534e89815f95ba9d3bdc3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gremaud?= Date: Fri, 8 Sep 2023 12:57:06 +0200 Subject: [PATCH] More mappings, fix multi select with telescope --- lua/core/default_config.lua | 2 +- lua/core/mappings.lua | 105 ++++++++++++++++++++---------- lua/plugins/configs/telescope.lua | 96 ++++++++++++++++++++++----- lua/plugins/init.lua | 1 + 4 files changed, 149 insertions(+), 55 deletions(-) diff --git a/lua/core/default_config.lua b/lua/core/default_config.lua index f2ec8f8..0f2b957 100644 --- a/lua/core/default_config.lua +++ b/lua/core/default_config.lua @@ -68,7 +68,7 @@ M.ui = { buttons = { { " Find File", "Spc f f", "Telescope find_files" }, { "󰈚 Recent Files", "Spc f o", "Telescope oldfiles" }, - { "󰈭 Find Word", "Spc f w", "Telescope live_grep" }, + { "󰈭 Find Word", "Spc f w", "Telescope find_grep" }, { " Bookmarks", "Spc m a", "Telescope marks" }, { " Themes", "Spc t h", "Telescope themes" }, { " Mappings", "Spc c h", "NvCheatsheet" }, diff --git a/lua/core/mappings.lua b/lua/core/mappings.lua index 487e665..a54aeea 100644 --- a/lua/core/mappings.lua +++ b/lua/core/mappings.lua @@ -27,10 +27,10 @@ M.general = { -- [""] = { " tab Git diff %", "Git diff this file" }, [""] = { " DiffviewOpen -- %", "Git diff this file" }, [""] = { " DiffviewFileHistory %", "Git history diff this file" }, - [""] = { " DiffviewClose", "Close git diff" }, + [""] = { " DiffviewClose", "Close git diff" }, -- [""] = { " tab Git diff", "Git diff global" }, [""] = { " DiffviewOpen", "Git diff global" }, - [""] = { ":DiffviewOpen HEAD~", "Show last N commits" }, + [""] = { ":DiffviewOpen HEAD~", "Show last N commits" }, ["gd"] = { " DiffviewClose", "Git diff close" }, -- save @@ -46,7 +46,7 @@ M.general = { -- ["n"] = { " set nu! ", "Toggle line number" }, -- ["rn"] = { " set rnu! ", "Toggle relative number" }, - -- Allow moving the cursor through wrapped lines with j, k, and + -- allow moving the cursor through wrapped lines with j, k, and -- http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/ -- empty mode is same as using :map -- also don't use g[j|k] when in operator pending mode, so it doesn't alter d, y or c behaviour @@ -76,31 +76,54 @@ M.general = { -- ["j"] = { 'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down", opts = { expr = true } }, -- ["k"] = { 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up", opts = { expr = true } }, -- Don't copy the replaced text after pasting in visual mode - -- https://vim.fandom.com/wiki/Replace_a_word_with_yanked_text#Alternative_mapping_for_paste + -- https://vim.fandom.com/wiki/Replace_a_word_with_yanked_text#alternative_mapping_for_paste ["p"] = { 'p:let @+=@0:let @"=@0', "Dont copy replaced text", opts = { silent = true } }, }, } M.customstuffs = { - n = { - [""] = { "o", "Insert new line below" }, - [""] = { "O", "Insert new line above" }, - [""] = { " vertical topleft Git vertical resize 50", "Show Git status on a left pane" }, - [""] = { " tabprevious", "Previous tab" }, - [""] = { " tabnext", "Next tab" }, - [""] = { " Flog -all", "Show git tree" }, - [""] = { " tab Git show -", "Git show N last commits" }, - [""] = { " TagbarToggle", "Show tagbar" }, - ["ra"] = { " call VrcQuery()", "Call REST endpoint" }, - ["dl"] = { "0d$", "Delete line from start" }, - ["gp"] = { " Git pull", "Git pull" }, - ["gnb"] = { ":Git checkout -b ", "Checkout to a new branch" }, - ["gri"] = { ":Git rebase -i HEAD~", "Git rebase interactive from HEAD" }, - ["mkd"] = { "lua vim.api.nvim_create_user_command('PeekOpen', require('peek').open, {})", "Open markdown preview" }, - ["mkc"] = { "lua vim.api.nvim_create_user_command('PeekClose', require('peek').close, {})", "Open markdown preview" }, - } + n = { + [""] = { "o", "Insert new line below" }, + [""] = { "O", "Insert new line above" }, + [""] = { " vertical topleft Git vertical resize 50", "Show Git status on a left pane" }, + [""] = { " tabprevious", "Previous tab" }, + [""] = { " tabnext", "Next tab" }, + [""] = { " Flog -all", "Show git tree" }, + [""] = { " tab Git show -", "Git show N last commits" }, + [""] = { " TagbarToggle", "Show tagbar" }, + ["ra"] = { " call VrcQuery()", "Call REST endpoint" }, + ["dl"] = { "0d$", "Delete line from start" }, + ["gp"] = { " Git pull", "Git pull" }, + ["gnb"] = { ":Git checkout -b ", "Checkout to a new branch" }, + ["gri"] = { ":Git rebase -i HEAD~", "Git rebase interactive from HEAD" }, + ["mkd"] = { "lua vim.api.nvim_create_user_command('PeekOpen', require('peek').open, {})", "Open markdown preview" }, + ["mkc"] = { "lua vim.api.nvim_create_user_command('PeekClose', require('peek').close, {})", "Open markdown preview" }, + ["n"] = { "nzz", "Next + auto center" }, + ["N"] = { "Nzz", "Previous + auto center" }, + ["("] = { "(zz", "Previous + auto center" }, + [")"] = { ")zz", "Previous + auto center" }, + ["{"] = { "{zz", "Previous + auto center" }, + ["}"] = { "}zz", "Previous + auto center" }, + ["[["] = { "[[zz", "Previous + auto center" }, + ["]]"] = { "]]zz", "Previous + auto center" }, + + -- Mappings: TODO + + -- "trim(system('git branch --show-current 2>/dev/null'))" + ["tt"] = { ":call append(line('.') - 1, repeat(' ', indent('.')) . '# TODO-' . trim(system('git branch --show-current 2>/dev/null')) . ': ' . input('Comment >'))", "Add TODO comment + add to quickfix list" }, + }, + v = { + ["n"] = { "nzz", "Next + auto center" }, + ["N"] = { "Nzz", "Previous + auto center" }, + ["("] = { "(zz", "Previous + auto center" }, + [")"] = { ")zz", "Previous + auto center" }, + ["{"] = { "{zz", "Previous + auto center" }, + ["}"] = { "}zz", "Previous + auto center" }, + ["[["] = { "[[zz", "Previous + auto center" }, + ["]]"] = { "]]zz", "Previous + auto center" }, + }, } M.tabufline = { @@ -243,12 +266,12 @@ M.lspconfig = { "Goto next", }, - ["q"] = { - function() - vim.diagnostic.setloclist() - end, - "Diagnostic setloclist", - }, + -- ["q"] = { + -- function() + -- vim.diagnostic.setloclist() + -- end, + -- "Diagnostic setloclist", + -- }, ["fm"] = { function() @@ -261,7 +284,7 @@ M.lspconfig = { function() vim.lsp.buf.add_workspace_folder() end, - "Add workspace folder", + "add workspace folder", }, ["wr"] = { @@ -297,12 +320,22 @@ M.telescope = { n = { -- Resume - [""] = { " Telescope resume ", "Resume" }, + [""] = { " Telescope resume ", "Resume" }, -- find [""] = { " Telescope find_files ", "Find files" }, [""] = { " Telescope find_files follow=true no_ignore=true hidden=true ", "Find all" }, [""] = { " Telescope live_grep ", "Live grep" }, [""] = { " Telescope buffers ", "Find buffers" }, + + ["fg"] = { " lua require('telescope.builtin').live_grep({default_text=vim.fn.getreg('/')}) ", "Live grep with actual search value as prefix" }, + ["ac"] = { ":execute 'vimgrep' input('Pattern >', getreg('/')) '**/*' ", "add search term files in quickfix list" }, + ["qc"] = { " Telescope quickfix ", "Show quickfix list" }, + ["qr"] = { ":execute 'cdo' '%s/' . input('Search term >', getreg('/')) . '/' . input('Replace by >', getreg('')) . '/g | update' ", "Replace pattern in all quickfix list" }, + + ["ll"] = { " Telescope loclist ", "Show loclist list" }, + ["ln"] = { ":lnext", "Jump to next in loclist" }, + ["lp"] = { ":lprevious", "Jump to previous in loclist" }, + ["fh"] = { " Telescope help_tags ", "Help page" }, ["fo"] = { " Telescope oldfiles ", "Find oldfiles" }, ["fz"] = { " Telescope current_buffer_fuzzy_find ", "Find in current buffer" }, @@ -337,21 +370,21 @@ M.nvterm = { t = { -- toggle in terminal mode - [""] = { + [""] = { function() require("nvterm.terminal").toggle "float" end, "Toggle floating term", }, - [""] = { + [""] = { function() require("nvterm.terminal").toggle "horizontal" end, "Toggle horizontal term", }, - [""] = { + [""] = { function() require("nvterm.terminal").toggle "vertical" end, @@ -361,21 +394,21 @@ M.nvterm = { n = { -- toggle in normal mode - [""] = { + [""] = { function() require("nvterm.terminal").toggle "float" end, "Toggle floating term", }, - [""] = { + [""] = { function() require("nvterm.terminal").toggle "horizontal" end, "Toggle horizontal term", }, - [""] = { + [""] = { function() require("nvterm.terminal").toggle "vertical" end, @@ -474,7 +507,7 @@ M.gitsigns = { opts = { expr = true }, }, - -- Actions + -- actions ["rh"] = { function() require("gitsigns").reset_hunk() diff --git a/lua/plugins/configs/telescope.lua b/lua/plugins/configs/telescope.lua index 3a36eb5..5d002b5 100644 --- a/lua/plugins/configs/telescope.lua +++ b/lua/plugins/configs/telescope.lua @@ -1,34 +1,94 @@ local custom_actions = {} local actions = require("telescope.actions") local action_state = require("telescope.actions.state") +local from_entry = require("telescope.from_entry") -function custom_actions._multiopen(prompt_bufnr, open_cmd) - local picker = action_state.get_current_picker(prompt_bufnr) - local selected_entry = action_state.get_selected_entry() - local num_selections = #picker:get_multi_selection() - if not num_selections or num_selections < 1 then - actions.add_selection(prompt_bufnr) +local entry_to_qf = function(entry) + local text = entry.text + + if not text then + if type(entry.value) == "table" then + text = entry.value.text + else + text = entry.value + end + end + + return { + bufnr = entry.bufnr, + filename = from_entry.path(entry, false, false), + lnum = vim.F.if_nil(entry.lnum, 1), + col = vim.F.if_nil(entry.col, 1), + text = text, + } +end + +local send_selected_to_list_without_closing_prompt = function(prompt_bufnr, mode, target) + local picker = action_state.get_current_picker(prompt_bufnr) + + local qf_entries = {} + for _, entry in ipairs(picker:get_multi_selection()) do + table.insert(qf_entries, entry_to_qf(entry)) + end + + local prompt = picker:_get_prompt() + -- actions.close(prompt_bufnr) + + vim.api.nvim_exec_autocmds("QuickFixCmdPre", {}) + if target == "loclist" then + vim.fn.setloclist(picker.original_win_id, qf_entries, mode) + else + local qf_title = string.format([[%s (%s)]], picker.prompt_title, prompt) + vim.fn.setqflist(qf_entries, mode) + vim.fn.setqflist({}, "a", { title = qf_title }) + end + vim.api.nvim_exec_autocmds("QuickFixCmdPost", {}) +end + +function custom_actions._multiopen(prompt_bufnr, cmd, cmd2, mode, list) + -- actions.send_selected_to_loclist(prompt_bufnr) + local picker = action_state.get_current_picker(prompt_bufnr) + local multi = picker:get_multi_selection() + local single = picker:get_selection() + + local str = "" + + if #multi > 0 then + + send_selected_to_list_without_closing_prompt(prompt_bufnr, mode, list) + + for i, j in ipairs(multi) do + if i % 2 == 1 then + str = str..cmd.." "..j[1].." | " + else + str = str..cmd2.." "..j[1].." | " + end end - actions.send_selected_to_loclist(prompt_bufnr) - vim.cmd("lfdo " .. open_cmd) + else + str = cmd.." "..single[1] + end + + -- To avoid populating qf or doing ":edit! file", close the prompt first + actions.close(prompt_bufnr) + vim.api.nvim_command(str) end function custom_actions.multi_selection_open(prompt_bufnr) - return custom_actions._multiopen(prompt_bufnr, "edit") + return custom_actions._multiopen(prompt_bufnr, "edit", "edit", "a", "loclist") end function custom_actions.multi_selection_vsplit(prompt_bufnr) - return custom_actions._multiopen(prompt_bufnr, "vsplit") + return custom_actions._multiopen(prompt_bufnr, "vsplit", "split", "a", "loclist") end function custom_actions.multi_selection_split(prompt_bufnr) - return custom_actions._multiopen(prompt_bufnr, "split") + return custom_actions._multiopen(prompt_bufnr, "split", "vsplit", "a", "loclist") end function custom_actions.multi_selection_vtab(prompt_bufnr) - return custom_actions._multiopen(prompt_bufnr, "tabe") + return custom_actions._multiopen(prompt_bufnr, "tabe", "tabe", "a", "loclist") end local options = { @@ -53,15 +113,15 @@ local options = { layout_config = { horizontal = { prompt_position = "top", - preview_width = 0.55, + preview_width = 0.60, results_width = 0.8, }, vertical = { mirror = false, }, - width = 0.87, - height = 0.80, - preview_cutoff = 120, + width = 0.90, + height = 0.92, + preview_cutoff = 200, }, file_sorter = require("telescope.sorters").get_fuzzy_file, file_ignore_patterns = { "node_modules" }, @@ -78,7 +138,7 @@ local options = { -- Developer configurations: Not meant for general override buffer_previewer_maker = require("telescope.previewers").buffer_previewer_maker, mappings = { - n = { ["q"] = require("telescope.actions").close }, + n = { ["q"] = actions.close }, }, }, pickers = { @@ -101,7 +161,7 @@ local options = { [""] = custom_actions.multi_selection_vsplit, [""] = custom_actions.multi_selection_split, [""] = custom_actions.multi_selection_tab, - [""] = actions.send_selected_to_loclist, + [""] = actions.send_selected_to_qflist, }, n = i, } diff --git a/lua/plugins/init.lua b/lua/plugins/init.lua index a4200ea..845494b 100644 --- a/lua/plugins/init.lua +++ b/lua/plugins/init.lua @@ -89,6 +89,7 @@ local default_plugins = { { "lukas-reineke/indent-blankline.nvim", + version = "2.20.7", init = function() require("core.utils").lazy_load "indent-blankline.nvim" end,