dotfiles/nvim/lua/tel.lua

208 lines
8.1 KiB
Lua
Raw Normal View History

2022-01-18 01:25:46 -05:00
local telescope = require('telescope')
telescope.setup({
2022-11-08 20:32:39 -05:00
defaults = {
file_ignore_patterns = { '.git' },
mappings = {
i = {
['<C-o>'] = { '<Esc>', type = 'command' },
['<Esc>'] = 'close',
['<C-s>'] = 'select_horizontal',
},
n = {
q = 'close',
['<C-o>'] = { '<Nop>', type = 'command' },
['<C-s>'] = 'select_horizontal',
},
},
sorting_strategy = 'ascending',
layout_config = {
prompt_position = 'top',
},
prompt_prefix = ' ',
selection_caret = ' ',
multi_icon = '',
},
pickers = {
buffers = {
mappings = {
n = {
dd = 'delete_buffer',
},
},
},
find_files = {
hidden = true,
},
lsp_code_actions = {
initial_mode = 'normal',
},
lsp_range_code_actions = {
initial_mode = 'normal',
},
},
2022-01-18 01:25:46 -05:00
})
telescope.load_extension('fzf')
-- taken from https://github.com/nvim-telescope/telescope-ui-select.nvim for code actions
telescope.register_extension {
2022-11-08 20:32:39 -05:00
setup = function(topts)
local specific_opts = vim.F.if_nil(topts.specific_opts, {})
topts.specific_opts = nil
if #topts == 1 and topts[1] ~= nil then
topts = topts[1]
end
local pickers = require "telescope.pickers"
local finders = require "telescope.finders"
local conf = require("telescope.config").values
local actions = require "telescope.actions"
local action_state = require "telescope.actions.state"
local strings = require "plenary.strings"
local entry_display = require "telescope.pickers.entry_display"
local utils = require "telescope.utils"
__TelescopeUISelectSpecificOpts = vim.F.if_nil(
__TelescopeUISelectSpecificOpts,
vim.tbl_extend("keep", specific_opts, {
["codeaction"] = {
make_indexed = function(items)
local indexed_items = {}
local widths = {
idx = 0,
command_title = 0,
client_name = 0,
}
for idx, item in ipairs(items) do
local client = vim.lsp.get_client_by_id(item[1])
local entry = {
idx = idx,
["add"] = {
command_title = item[2].title:gsub("\r\n", "\\r\\n"):gsub("\n", "\\n"),
client_name = client and client.name or "",
},
text = item,
}
table.insert(indexed_items, entry)
widths.idx = math.max(widths.idx, strings.strdisplaywidth(entry.idx))
widths.command_title = math.max(widths.command_title,
strings.strdisplaywidth(entry.add.command_title))
widths.client_name = math.max(widths.client_name,
strings.strdisplaywidth(entry.add.client_name))
end
return indexed_items, widths
end,
make_displayer = function(widths)
return entry_display.create {
separator = " ",
items = {
{ width = widths.idx + 1 }, -- +1 for ":" suffix
{ width = widths.command_title },
{ width = widths.client_name },
},
}
end,
make_display = function(displayer)
return function(e)
return displayer {
2023-05-11 21:09:38 -04:00
{ e.value.idx .. ":", "TelescopePromptPrefix" },
2022-11-08 20:32:39 -05:00
{ e.value.add.command_title },
2023-05-11 21:09:38 -04:00
{ e.value.add.client_name, "TelescopeResultsComment" },
2022-11-08 20:32:39 -05:00
}
end
end,
make_ordinal = function(e)
return e.idx .. e.add["command_title"]
end,
},
})
)
vim.ui.select = function(items, opts, on_choice)
opts = opts or {}
local prompt = vim.F.if_nil(opts.prompt, "Select one of")
if prompt:sub(-1, -1) == ":" then
prompt = prompt:sub(1, -2)
end
opts.format_item = vim.F.if_nil(opts.format_item, function(e)
return tostring(e)
end)
-- We want or here because __TelescopeUISelectSpecificOpts[x] can be either nil or even false -> {}
local sopts = __TelescopeUISelectSpecificOpts[vim.F.if_nil(opts.kind, "")] or {}
local indexed_items, widths = vim.F.if_nil(sopts.make_indexed, function(items_)
local indexed_items = {}
for idx, item in ipairs(items_) do
table.insert(indexed_items, { idx = idx, text = item })
end
return indexed_items
end)(items)
2023-05-11 21:09:38 -04:00
local displayer = vim.F.if_nil(sopts.make_displayer, function()
end)(widths)
2022-11-08 20:32:39 -05:00
local make_display = vim.F.if_nil(sopts.make_display, function(_)
return function(e)
local x, _ = opts.format_item(e.value.text)
return x
end
end)(displayer)
local make_ordinal = vim.F.if_nil(sopts.make_ordinal, function(e)
return opts.format_item(e.text)
end)
pickers.new(topts, {
prompt_title = prompt,
finder = finders.new_table {
results = indexed_items,
entry_maker = function(e)
return {
value = e,
display = make_display,
ordinal = make_ordinal(e),
}
end,
},
attach_mappings = function(prompt_bufnr)
actions.select_default:replace(function()
local selection = action_state.get_selected_entry()
if selection == nil then
utils.__warn_no_selection "ui-select"
return
end
actions.close(prompt_bufnr)
on_choice(selection.value.text, selection.value.idx)
end)
return true
end,
sorter = conf.generic_sorter(topts),
}):find()
end
end,
}
2022-01-18 01:25:46 -05:00
local map = vim.api.nvim_set_keymap
2022-11-08 20:32:39 -05:00
map('n', '<Leader>pf', '<Cmd>Telescope find_files<CR>', { noremap = true })
map('n', '<Leader>pb', '<Cmd>Telescope buffers<CR>', { noremap = true })
map('n', '<Leader>po', '<Cmd>Telescope lsp_document_symbols<CR>', { noremap = true })
map('n', '<Leader>ps', '<Cmd>Telescope lsp_workspace_symbols<CR>', { noremap = true })
map('n', '<Leader>pd', '<Cmd>Telescope lsp_definitions<CR>', { noremap = true })
map('n', '<Leader>pr', '<Cmd>Telescope lsp_references<CR>', { noremap = true })
map('n', '<Leader>pp', '<C-^>', { noremap = true })
map('n', '<Leader>p', ':Telescope ', { noremap = true })
map('n', '<Leader>p ', ':Telescope ', { noremap = true })
2022-01-18 01:25:46 -05:00
2022-11-08 20:32:39 -05:00
map('n', '<Leader>.', ':lua vim.lsp.buf.code_action()<CR>', { noremap = true })
2022-01-18 01:25:46 -05:00
-- vim.cmd [[
-- function! s:telescope_hlsetup() abort
2022-11-08 20:32:39 -05:00
-- highlight link TelescopeBorder NonText
2022-01-18 01:25:46 -05:00
-- highlight link TelescopeTitle NonText
-- endfunction
-- call s:telescope_hlsetup()
-- augroup telescope_hlsetup
-- au!
-- au ColorScheme * call s:telescope_hlsetup()
-- augroup END
-- ]]