More mappings, fix multi select with telescope

This commit is contained in:
Loïc Gremaud 2023-09-08 12:57:06 +02:00
parent 25bc8e05c4
commit 8d535ad186
No known key found for this signature in database
GPG Key ID: ACD9F65FA7E19986
4 changed files with 149 additions and 55 deletions

View File

@ -68,7 +68,7 @@ M.ui = {
buttons = { buttons = {
{ " Find File", "Spc f f", "Telescope find_files" }, { " Find File", "Spc f f", "Telescope find_files" },
{ "󰈚 Recent Files", "Spc f o", "Telescope oldfiles" }, { "󰈚 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" }, { " Bookmarks", "Spc m a", "Telescope marks" },
{ " Themes", "Spc t h", "Telescope themes" }, { " Themes", "Spc t h", "Telescope themes" },
{ " Mappings", "Spc c h", "NvCheatsheet" }, { " Mappings", "Spc c h", "NvCheatsheet" },

View File

@ -27,10 +27,10 @@ M.general = {
-- ["<C-d>"] = { "<cmd> tab Git diff %<CR>", "Git diff this file" }, -- ["<C-d>"] = { "<cmd> tab Git diff %<CR>", "Git diff this file" },
["<C-d>"] = { "<cmd> DiffviewOpen -- %<CR>", "Git diff this file" }, ["<C-d>"] = { "<cmd> DiffviewOpen -- %<CR>", "Git diff this file" },
["<C-o>"] = { "<cmd> DiffviewFileHistory %<CR>", "Git history diff this file" }, ["<C-o>"] = { "<cmd> DiffviewFileHistory %<CR>", "Git history diff this file" },
["<C-A-d>"] = { "<cmd> DiffviewClose<CR>", "Close git diff" }, ["<C-a-d>"] = { "<cmd> DiffviewClose<CR>", "Close git diff" },
-- ["<C-p>"] = { "<cmd> tab Git diff<CR>", "Git diff global" }, -- ["<C-p>"] = { "<cmd> tab Git diff<CR>", "Git diff global" },
["<C-p>"] = { "<cmd> DiffviewOpen<CR>", "Git diff global" }, ["<C-p>"] = { "<cmd> DiffviewOpen<CR>", "Git diff global" },
["<A-p>"] = { ":DiffviewOpen HEAD~", "Show last N commits" }, ["<a-p>"] = { ":DiffviewOpen HEAD~", "Show last N commits" },
["<leader>gd"] = { "<cmd> DiffviewClose<CR>", "Git diff close" }, ["<leader>gd"] = { "<cmd> DiffviewClose<CR>", "Git diff close" },
-- save -- save
@ -46,7 +46,7 @@ M.general = {
-- ["<leader>n"] = { "<cmd> set nu! <CR>", "Toggle line number" }, -- ["<leader>n"] = { "<cmd> set nu! <CR>", "Toggle line number" },
-- ["<leader>rn"] = { "<cmd> set rnu! <CR>", "Toggle relative number" }, -- ["<leader>rn"] = { "<cmd> set rnu! <CR>", "Toggle relative number" },
-- Allow moving the cursor through wrapped lines with j, k, <Up> and <Down> -- allow moving the cursor through wrapped lines with j, k, <Up> and <Down>
-- http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/ -- http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/
-- empty mode is same as using <cmd> :map -- empty mode is same as using <cmd> :map
-- also don't use g[j|k] when in operator pending mode, so it doesn't alter d, y or c behaviour -- 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 } }, -- ["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 } }, -- ["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 -- 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<CR>:let @"=@0<CR>', "Dont copy replaced text", opts = { silent = true } }, ["p"] = { 'p:let @+=@0<CR>:let @"=@0<CR>', "Dont copy replaced text", opts = { silent = true } },
}, },
} }
M.customstuffs = { M.customstuffs = {
n = { n = {
["<Return>"] = { "o<ESC>", "Insert new line below" }, ["<Return>"] = { "o<ESC>", "Insert new line below" },
["<BS>"] = { "O<ESC>", "Insert new line above" }, ["<BS>"] = { "O<ESC>", "Insert new line above" },
["<C-c>"] = { "<cmd> vertical topleft Git <bar> vertical resize 50<CR>", "Show Git status on a left pane" }, ["<C-c>"] = { "<cmd> vertical topleft Git <bar> vertical resize 50<CR>", "Show Git status on a left pane" },
["<F1>"] = { "<cmd> tabprevious<CR>", "Previous tab" }, ["<F1>"] = { "<cmd> tabprevious<CR>", "Previous tab" },
["<F2>"] = { "<cmd> tabnext<CR>", "Next tab" }, ["<F2>"] = { "<cmd> tabnext<CR>", "Next tab" },
["<F3>"] = { "<cmd> Flog -all<CR>", "Show git tree" }, ["<F3>"] = { "<cmd> Flog -all<CR>", "Show git tree" },
["<F4>"] = { "<cmd> tab Git show -", "Git show N last commits" }, ["<F4>"] = { "<cmd> tab Git show -", "Git show N last commits" },
["<C-t>"] = { "<cmd> TagbarToggle<CR>", "Show tagbar" }, ["<C-t>"] = { "<cmd> TagbarToggle<CR>", "Show tagbar" },
["<leader>ra"] = { "<cmd> call VrcQuery()<CR>", "Call REST endpoint" }, ["<leader>ra"] = { "<cmd> call VrcQuery()<CR>", "Call REST endpoint" },
["<leader>dl"] = { "0d$", "Delete line from start" }, ["<leader>dl"] = { "0d$", "Delete line from start" },
["<leader>gp"] = { "<cmd> Git pull<CR>", "Git pull" }, ["<leader>gp"] = { "<cmd> Git pull<CR>", "Git pull" },
["<leader>gnb"] = { ":Git checkout -b ", "Checkout to a new branch" }, ["<leader>gnb"] = { ":Git checkout -b ", "Checkout to a new branch" },
["<leader>gri"] = { ":Git rebase -i HEAD~", "Git rebase interactive from HEAD" }, ["<leader>gri"] = { ":Git rebase -i HEAD~", "Git rebase interactive from HEAD" },
["<leader>mkd"] = { "<cmd>lua vim.api.nvim_create_user_command('PeekOpen', require('peek').open, {})<CR>", "Open markdown preview" }, ["<leader>mkd"] = { "<cmd>lua vim.api.nvim_create_user_command('PeekOpen', require('peek').open, {})<CR>", "Open markdown preview" },
["<leader>mkc"] = { "<cmd>lua vim.api.nvim_create_user_command('PeekClose', require('peek').close, {})<CR>", "Open markdown preview" }, ["<leader>mkc"] = { "<cmd>lua vim.api.nvim_create_user_command('PeekClose', require('peek').close, {})<CR>", "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'))"
["<leader>tt"] = { ":call append(line('.') - 1, repeat(' ', indent('.')) . '# TODO-' . trim(system('git branch --show-current 2>/dev/null')) . ': ' . input('Comment >'))<CR>", "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 = { M.tabufline = {
@ -243,12 +266,12 @@ M.lspconfig = {
"Goto next", "Goto next",
}, },
["<leader>q"] = { -- ["<leader>q"] = {
function() -- function()
vim.diagnostic.setloclist() -- vim.diagnostic.setloclist()
end, -- end,
"Diagnostic setloclist", -- "Diagnostic setloclist",
}, -- },
["<leader>fm"] = { ["<leader>fm"] = {
function() function()
@ -261,7 +284,7 @@ M.lspconfig = {
function() function()
vim.lsp.buf.add_workspace_folder() vim.lsp.buf.add_workspace_folder()
end, end,
"Add workspace folder", "add workspace folder",
}, },
["<leader>wr"] = { ["<leader>wr"] = {
@ -297,12 +320,22 @@ M.telescope = {
n = { n = {
-- Resume -- Resume
["<A-f>"] = { "<cmd> Telescope resume <CR>", "Resume" }, ["<a-f>"] = { "<cmd> Telescope resume <CR>", "Resume" },
-- find -- find
["<C-g>"] = { "<cmd> Telescope find_files <CR>", "Find files" }, ["<C-g>"] = { "<cmd> Telescope find_files <CR>", "Find files" },
["<C-x>"] = { "<cmd> Telescope find_files follow=true no_ignore=true hidden=true <CR>", "Find all" }, ["<C-x>"] = { "<cmd> Telescope find_files follow=true no_ignore=true hidden=true <CR>", "Find all" },
["<C-f>"] = { "<cmd> Telescope live_grep <CR>", "Live grep" }, ["<C-f>"] = { "<cmd> Telescope live_grep <CR>", "Live grep" },
["<C-b>"] = { "<cmd> Telescope buffers <CR>", "Find buffers" }, ["<C-b>"] = { "<cmd> Telescope buffers <CR>", "Find buffers" },
["<leader>fg"] = { "<cmd> lua require('telescope.builtin').live_grep({default_text=vim.fn.getreg('/')}) <CR>", "Live grep with actual search value as prefix" },
["<leader>ac"] = { ":execute 'vimgrep' input('Pattern >', getreg('/')) '**/*' <CR>", "add search term files in quickfix list" },
["<leader>qc"] = { "<cmd> Telescope quickfix <CR>", "Show quickfix list" },
["<leader>qr"] = { ":execute 'cdo' '%s/' . input('Search term >', getreg('/')) . '/' . input('Replace by >', getreg('')) . '/g | update' <CR>", "Replace pattern in all quickfix list" },
["<leader>ll"] = { "<cmd> Telescope loclist <CR>", "Show loclist list" },
["<leader>ln"] = { ":lnext<CR>", "Jump to next in loclist" },
["<leader>lp"] = { ":lprevious<CR>", "Jump to previous in loclist" },
["<leader>fh"] = { "<cmd> Telescope help_tags <CR>", "Help page" }, ["<leader>fh"] = { "<cmd> Telescope help_tags <CR>", "Help page" },
["<leader>fo"] = { "<cmd> Telescope oldfiles <CR>", "Find oldfiles" }, ["<leader>fo"] = { "<cmd> Telescope oldfiles <CR>", "Find oldfiles" },
["<leader>fz"] = { "<cmd> Telescope current_buffer_fuzzy_find <CR>", "Find in current buffer" }, ["<leader>fz"] = { "<cmd> Telescope current_buffer_fuzzy_find <CR>", "Find in current buffer" },
@ -337,21 +370,21 @@ M.nvterm = {
t = { t = {
-- toggle in terminal mode -- toggle in terminal mode
["<A-i>"] = { ["<a-i>"] = {
function() function()
require("nvterm.terminal").toggle "float" require("nvterm.terminal").toggle "float"
end, end,
"Toggle floating term", "Toggle floating term",
}, },
["<A-h>"] = { ["<a-h>"] = {
function() function()
require("nvterm.terminal").toggle "horizontal" require("nvterm.terminal").toggle "horizontal"
end, end,
"Toggle horizontal term", "Toggle horizontal term",
}, },
["<A-v>"] = { ["<a-v>"] = {
function() function()
require("nvterm.terminal").toggle "vertical" require("nvterm.terminal").toggle "vertical"
end, end,
@ -361,21 +394,21 @@ M.nvterm = {
n = { n = {
-- toggle in normal mode -- toggle in normal mode
["<A-i>"] = { ["<a-i>"] = {
function() function()
require("nvterm.terminal").toggle "float" require("nvterm.terminal").toggle "float"
end, end,
"Toggle floating term", "Toggle floating term",
}, },
["<A-h>"] = { ["<a-h>"] = {
function() function()
require("nvterm.terminal").toggle "horizontal" require("nvterm.terminal").toggle "horizontal"
end, end,
"Toggle horizontal term", "Toggle horizontal term",
}, },
["<A-v>"] = { ["<a-v>"] = {
function() function()
require("nvterm.terminal").toggle "vertical" require("nvterm.terminal").toggle "vertical"
end, end,
@ -474,7 +507,7 @@ M.gitsigns = {
opts = { expr = true }, opts = { expr = true },
}, },
-- Actions -- actions
["<leader>rh"] = { ["<leader>rh"] = {
function() function()
require("gitsigns").reset_hunk() require("gitsigns").reset_hunk()

View File

@ -1,34 +1,94 @@
local custom_actions = {} local custom_actions = {}
local actions = require("telescope.actions") local actions = require("telescope.actions")
local action_state = require("telescope.actions.state") 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 local entry_to_qf = function(entry)
actions.add_selection(prompt_bufnr) 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 end
actions.send_selected_to_loclist(prompt_bufnr) else
vim.cmd("lfdo " .. open_cmd) 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 end
function custom_actions.multi_selection_open(prompt_bufnr) 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 end
function custom_actions.multi_selection_vsplit(prompt_bufnr) 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 end
function custom_actions.multi_selection_split(prompt_bufnr) 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 end
function custom_actions.multi_selection_vtab(prompt_bufnr) 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 end
local options = { local options = {
@ -53,15 +113,15 @@ local options = {
layout_config = { layout_config = {
horizontal = { horizontal = {
prompt_position = "top", prompt_position = "top",
preview_width = 0.55, preview_width = 0.60,
results_width = 0.8, results_width = 0.8,
}, },
vertical = { vertical = {
mirror = false, mirror = false,
}, },
width = 0.87, width = 0.90,
height = 0.80, height = 0.92,
preview_cutoff = 120, preview_cutoff = 200,
}, },
file_sorter = require("telescope.sorters").get_fuzzy_file, file_sorter = require("telescope.sorters").get_fuzzy_file,
file_ignore_patterns = { "node_modules" }, file_ignore_patterns = { "node_modules" },
@ -78,7 +138,7 @@ local options = {
-- Developer configurations: Not meant for general override -- Developer configurations: Not meant for general override
buffer_previewer_maker = require("telescope.previewers").buffer_previewer_maker, buffer_previewer_maker = require("telescope.previewers").buffer_previewer_maker,
mappings = { mappings = {
n = { ["q"] = require("telescope.actions").close }, n = { ["q"] = actions.close },
}, },
}, },
pickers = { pickers = {
@ -101,7 +161,7 @@ local options = {
["<C-V>"] = custom_actions.multi_selection_vsplit, ["<C-V>"] = custom_actions.multi_selection_vsplit,
["<C-X>"] = custom_actions.multi_selection_split, ["<C-X>"] = custom_actions.multi_selection_split,
["<C-T>"] = custom_actions.multi_selection_tab, ["<C-T>"] = custom_actions.multi_selection_tab,
["<C-SPACE>"] = actions.send_selected_to_loclist, ["<C-SPACE>"] = actions.send_selected_to_qflist,
}, },
n = i, n = i,
} }

View File

@ -89,6 +89,7 @@ local default_plugins = {
{ {
"lukas-reineke/indent-blankline.nvim", "lukas-reineke/indent-blankline.nvim",
version = "2.20.7",
init = function() init = function()
require("core.utils").lazy_load "indent-blankline.nvim" require("core.utils").lazy_load "indent-blankline.nvim"
end, end,