neovim-confs/lua/plex/plugins/telescope.lua

514 lines
15 KiB
Lua
Raw Normal View History

2023-09-06 00:26:45 +02:00
-- Plugin: telescope.nvim
-- https://github.com/rafi/vim-config
-- Helpers
-- Custom actions
local myactions = {}
function myactions.send_to_qflist(prompt_bufnr)
require('telescope.actions').send_to_qflist(prompt_bufnr)
vim.api.nvim_command([[ botright copen ]])
end
function myactions.smart_send_to_qflist(prompt_bufnr)
require('telescope.actions').smart_send_to_qflist(prompt_bufnr)
vim.api.nvim_command([[ botright copen ]])
end
--- Scroll the results window up
---@param prompt_bufnr number: The prompt bufnr
function myactions.results_scrolling_up(prompt_bufnr)
myactions.scroll_results(prompt_bufnr, -1)
end
--- Scroll the results window down
---@param prompt_bufnr number: The prompt bufnr
function myactions.results_scrolling_down(prompt_bufnr)
myactions.scroll_results(prompt_bufnr, 1)
end
---@param prompt_bufnr number: The prompt bufnr
---@param direction number: 1|-1
function myactions.scroll_results(prompt_bufnr, direction)
local status = require('telescope.state').get_status(prompt_bufnr)
local default_speed = vim.api.nvim_win_get_height(status.results_win) / 2
local speed = status.picker.layout_config.scroll_speed or default_speed
require('telescope.actions.set').shift_selection(
prompt_bufnr,
math.floor(speed) * direction
)
end
-- Custom pickers
local plugin_directories = function(opts)
local actions = require('telescope.actions')
local utils = require('telescope.utils')
local dir = vim.fn.stdpath('data') .. '/lazy'
opts = opts or {}
opts.cmd = vim.F.if_nil(opts.cmd, {
vim.o.shell,
'-c',
'find ' .. vim.fn.shellescape(dir) .. ' -mindepth 1 -maxdepth 1 -type d',
})
local dir_len = dir:len()
opts.entry_maker = function(line)
return {
value = line,
ordinal = line,
display = line:sub(dir_len + 2),
}
end
require('telescope.pickers')
.new(opts, {
layout_config = {
width = 0.65,
height = 0.7,
},
prompt_title = '[ Plugin directories ]',
finder = require('telescope.finders').new_table({
results = utils.get_os_command_output(opts.cmd),
entry_maker = opts.entry_maker,
}),
sorter = require('telescope.sorters').get_fuzzy_file(),
previewer = require('telescope.previewers.term_previewer').cat.new(opts),
attach_mappings = function(prompt_bufnr)
actions.select_default:replace(function()
local entry = require('telescope.actions.state').get_selected_entry()
actions.close(prompt_bufnr)
vim.cmd.tcd(entry.value)
end)
return true
end,
})
:find()
end
-- Custom window-sizes
---@param dimensions table
---@param size integer
---@return float
local function get_matched_ratio(dimensions, size)
for min_cols, scale in pairs(dimensions) do
if min_cols == 'lower' or size >= min_cols then
return math.floor(size * scale)
end
end
return dimensions.lower
end
local function width_tiny(_, cols, _)
return get_matched_ratio({ [180] = 0.27, lower = 0.37 }, cols)
end
local function width_small(_, cols, _)
return get_matched_ratio({ [180] = 0.4, lower = 0.5 }, cols)
end
local function width_medium(_, cols, _)
return get_matched_ratio({ [180] = 0.5, [110] = 0.6, lower = 0.75 }, cols)
end
local function width_large(_, cols, _)
return get_matched_ratio({ [180] = 0.7, [110] = 0.8, lower = 0.85 }, cols)
end
-- Enable indent-guides in telescope preview
vim.api.nvim_create_autocmd('User', {
pattern = 'TelescopePreviewerLoaded',
2023-09-06 10:19:56 +02:00
group = vim.api.nvim_create_augroup('plex_telescope', {}),
2023-09-06 00:26:45 +02:00
callback = function(args)
if args.buf ~= vim.api.nvim_win_get_buf(0) then
return
end
vim.opt_local.listchars = vim.wo.listchars .. ',tab:▏\\ '
vim.opt_local.conceallevel = 0
vim.opt_local.wrap = true
vim.opt_local.list = true
vim.opt_local.number = true
end,
})
-- Setup Telescope
-- See telescope.nvim/lua/telescope/config.lua for defaults.
return {
-----------------------------------------------------------------------------
{
'nvim-telescope/telescope.nvim',
cmd = 'Telescope',
commit = vim.fn.has('nvim-0.9') == 0 and '057ee0f8783' or nil,
dependencies = {
'nvim-lua/plenary.nvim',
'jvgrootveld/telescope-zoxide',
'folke/todo-comments.nvim',
'rafi/telescope-thesaurus.nvim',
},
config = function(_, opts)
require('telescope').setup(opts)
require('telescope').load_extension('persisted')
end,
-- stylua: ignore
keys = {
-- General pickers
{ '<localleader>r', '<cmd>Telescope resume initial_mode=normal<CR>', desc = 'Resume last' },
{ '<localleader>R', '<cmd>Telescope pickers<CR>', desc = 'Pickers' },
{ '<localleader>f', '<cmd>Telescope find_files<CR>', desc = 'Find files' },
{ '<localleader>g', '<cmd>Telescope live_grep<CR>', desc = 'Grep' },
{ '<localleader>b', '<cmd>Telescope buffers show_all_buffers=true<CR>', desc = 'Buffers' },
{ '<localleader>h', '<cmd>Telescope highlights<CR>', desc = 'Highlights' },
{ '<localleader>j', '<cmd>Telescope jumplist<CR>', desc = 'Jump list' },
{ '<localleader>m', '<cmd>Telescope marks<CR>', desc = 'Marks' },
{ '<localleader>o', '<cmd>Telescope vim_options<CR>', desc = 'Neovim options' },
{ '<localleader>t', '<cmd>Telescope lsp_dynamic_workspace_symbols<CR>', desc = 'Workspace symbols' },
{ '<localleader>v', '<cmd>Telescope registers<CR>', desc = 'Registers' },
{ '<localleader>u', '<cmd>Telescope spell_suggest<CR>', desc = 'Spell suggest' },
2023-09-06 13:00:21 +02:00
{ 'z<space>', '<cmd>Telescope spell_suggest<CR>', desc = 'Spell suggest' },
2023-09-06 11:47:14 +02:00
{ '<localleader>S', '<cmd>Telescope persisted<CR>', desc = 'Sessions' },
2023-09-06 00:26:45 +02:00
{ '<localleader>x', '<cmd>Telescope oldfiles<CR>', desc = 'Old files' },
{ '<localleader>;', '<cmd>Telescope command_history<CR>', desc = 'Command history' },
{ '<localleader>:', '<cmd>Telescope commands<CR>', desc = 'Commands' },
{ '<localleader>/', '<cmd>Telescope search_history<CR>', desc = 'Search history' },
{ '<leader>/', '<cmd>Telescope current_buffer_fuzzy_find<CR>', desc = 'Buffer find' },
2023-09-06 11:47:14 +02:00
{ '<leader>Sd', '<cmd>Telescope diagnostics bufnr=0<CR>', desc = 'Document diagnostics' },
{ '<leader>SD', '<cmd>Telescope diagnostics<CR>', desc = 'Workspace diagnostics' },
{ '<leader>Sh', '<cmd>Telescope help_tags<CR>', desc = 'Help Pages' },
{ '<leader>Sk', '<cmd>Telescope keymaps<CR>', desc = 'Key Maps' },
{ '<leader>Sm', '<cmd>Telescope man_pages<CR>', desc = 'Man Pages' },
{ '<leader>Sw', '<cmd>Telescope grep_string<CR>', desc = 'Word' },
{ '<leader>Sc', '<cmd>Telescope colorscheme<CR>', desc = 'Colorscheme' },
2023-09-06 00:26:45 +02:00
{ '<leader>uC', '<cmd>Telescope colorscheme<CR>', desc = 'Colorscheme' },
-- LSP related
{ '<localleader>dd', '<cmd>Telescope lsp_definitions<CR>', desc = 'Definitions' },
{ '<localleader>di', '<cmd>Telescope lsp_implementations<CR>', desc = 'Implementations' },
{ '<localleader>dr', '<cmd>Telescope lsp_references<CR>', desc = 'References' },
{ '<localleader>da', '<cmd>Telescope lsp_code_actions<CR>', desc = 'Code actions' },
{ '<localleader>da', ':Telescope lsp_range_code_actions<CR>', mode = 'x', desc = 'Code actions' },
{
2023-09-06 11:47:14 +02:00
'<leader>Ss',
2023-09-06 00:26:45 +02:00
function()
require('telescope.builtin').lsp_document_symbols({
symbols = {
'Class',
'Function',
'Method',
'Constructor',
'Interface',
'Module',
'Struct',
'Trait',
'Field',
'Property',
},
})
end,
desc = 'Goto Symbol',
},
{
2023-09-06 11:47:14 +02:00
'<leader>SS',
2023-09-06 00:26:45 +02:00
function()
require('telescope.builtin').lsp_dynamic_workspace_symbols({
symbols = {
'Class',
'Function',
'Method',
'Constructor',
'Interface',
'Module',
'Struct',
'Trait',
'Field',
'Property',
},
})
end,
desc = 'Goto Symbol (Workspace)',
},
-- Git
{ '<leader>gs', '<cmd>Telescope git_status<CR>', desc = 'Git status' },
{ '<leader>gr', '<cmd>Telescope git_branches<CR>', desc = 'Git branches' },
{ '<leader>gl', '<cmd>Telescope git_commits<CR>', desc = 'Git commits' },
{ '<leader>gL', '<cmd>Telescope git_bcommits<CR>', desc = 'Git buffer commits' },
{ '<leader>gh', '<cmd>Telescope git_stash<CR>', desc = 'Git stashes' },
{ '<leader>gc', '<cmd>Telescope git_bcommits_range<CR>', mode = { 'x', 'n' }, desc = 'Git bcommits range' },
-- Plugins
{ '<localleader>n', plugin_directories, desc = 'Plugins' },
2023-09-21 12:48:00 +02:00
-- { '<localleader>k', '<cmd>Telescope thesaurus lookup<CR>', desc = 'Thesaurus' },
-- { '<localleader>w', '<cmd>ZkNotes<CR>', desc = 'Zk notes' },
2023-09-06 00:26:45 +02:00
{
'<localleader>z',
function()
require('telescope').extensions.zoxide.list({
layout_config = { width = 0.5, height = 0.6 },
})
end,
desc = 'Zoxide (MRU)',
},
-- Find by...
{
'<leader>gt',
function()
require('telescope.builtin').lsp_workspace_symbols({
default_text = vim.fn.expand('<cword>'),
})
end,
desc = 'Find symbol',
},
{
'<leader>gf',
function()
require('telescope.builtin').find_files({
default_text = vim.fn.expand('<cword>'),
})
end,
desc = 'Find file',
},
{
'<leader>gg', function()
require('telescope.builtin').live_grep({
default_text = vim.fn.expand('<cword>'),
})
end,
desc = 'Grep cursor word',
},
{
'<leader>gg',
function()
require('telescope.builtin').live_grep({
2023-09-06 10:19:56 +02:00
default_text = require('plex.lib.edit').get_visual_selection(),
2023-09-06 00:26:45 +02:00
})
end,
mode = 'x',
desc = 'Grep cursor word',
},
},
opts = function()
local transform_mod = require('telescope.actions.mt').transform_mod
local actions = require('telescope.actions')
-- Transform to Telescope proper actions.
myactions = transform_mod(myactions)
-- Clone the default Telescope configuration and enable hidden files.
local has_ripgrep = vim.fn.executable('rg') == 1
local vimgrep_args = {
unpack(require('telescope.config').values.vimgrep_arguments),
}
table.insert(vimgrep_args, '--hidden')
table.insert(vimgrep_args, '--follow')
table.insert(vimgrep_args, '--no-ignore-vcs')
table.insert(vimgrep_args, '--glob')
table.insert(vimgrep_args, '!**/.git/*')
local find_args = {
'rg',
'--vimgrep',
'--files',
'--follow',
'--hidden',
'--no-ignore-vcs',
'--smart-case',
'--glob',
'!**/.git/*',
}
return {
defaults = {
sorting_strategy = 'ascending',
cache_picker = { num_pickers = 3 },
prompt_prefix = '', --  
selection_caret = '',
multi_icon = '',
path_display = { 'truncate' },
file_ignore_patterns = { 'node_modules' },
set_env = { COLORTERM = 'truecolor' },
vimgrep_arguments = has_ripgrep and vimgrep_args or nil,
layout_strategy = 'horizontal',
layout_config = {
prompt_position = 'top',
horizontal = {
height = 0.85,
},
},
-- stylua: ignore
mappings = {
i = {
['jj'] = { '<Esc>', type = 'command' },
['<Tab>'] = actions.move_selection_worse,
['<S-Tab>'] = actions.move_selection_better,
['<C-u>'] = actions.results_scrolling_up,
['<C-d>'] = actions.results_scrolling_down,
['<C-q>'] = myactions.smart_send_to_qflist,
['<C-n>'] = actions.cycle_history_next,
['<C-p>'] = actions.cycle_history_prev,
['<C-b>'] = actions.preview_scrolling_up,
['<C-f>'] = actions.preview_scrolling_down,
},
n = {
['q'] = actions.close,
['<Esc>'] = actions.close,
['<Tab>'] = actions.move_selection_worse,
['<S-Tab>'] = actions.move_selection_better,
['<C-u>'] = myactions.results_scrolling_up,
['<C-d>'] = myactions.results_scrolling_down,
['<C-b>'] = actions.preview_scrolling_up,
['<C-f>'] = actions.preview_scrolling_down,
['<C-n>'] = actions.cycle_history_next,
['<C-p>'] = actions.cycle_history_prev,
['*'] = actions.toggle_all,
['u'] = actions.drop_all,
['J'] = actions.toggle_selection + actions.move_selection_next,
['K'] = actions.toggle_selection + actions.move_selection_previous,
[' '] = {
actions.toggle_selection + actions.move_selection_next,
type = 'action',
opts = { nowait = true },
},
['sv'] = actions.select_horizontal,
['sg'] = actions.select_vertical,
['st'] = actions.select_tab,
['w'] = myactions.smart_send_to_qflist,
['e'] = myactions.send_to_qflist,
['!'] = actions.edit_command_line,
['t'] = function(...)
return require('trouble.providers.telescope').open_with_trouble(...)
end,
['p'] = function()
local entry = require('telescope.actions.state').get_selected_entry()
2023-09-06 10:19:56 +02:00
require('plex.lib.preview').open(entry.path)
2023-09-06 00:26:45 +02:00
end,
},
},
},
pickers = {
buffers = {
sort_lastused = true,
sort_mru = true,
show_all_buffers = true,
ignore_current_buffer = true,
layout_config = { width = width_large, height = 0.7 },
mappings = {
n = {
['dd'] = actions.delete_buffer,
},
},
},
find_files = {
find_command = has_ripgrep and find_args or nil,
},
live_grep = {
dynamic_preview_title = true,
},
colorscheme = {
enable_preview = true,
layout_config = { preview_width = 0.7 },
},
highlights = {
layout_config = { preview_width = 0.7 },
},
vim_options = {
theme = 'dropdown',
layout_config = { width = width_medium, height = 0.7 },
},
command_history = {
theme = 'dropdown',
layout_config = { width = width_medium, height = 0.7 },
},
search_history = {
theme = 'dropdown',
layout_config = { width = width_small, height = 0.6 },
},
spell_suggest = {
theme = 'cursor',
layout_config = { width = width_tiny, height = 0.45 },
},
registers = {
theme = 'cursor',
layout_config = { width = 0.35, height = 0.4 },
},
oldfiles = {
theme = 'dropdown',
previewer = false,
layout_config = { width = width_medium, height = 0.7 },
},
lsp_definitions = {
layout_config = { width = width_large, preview_width = 0.55 },
},
lsp_implementations = {
layout_config = { width = width_large, preview_width = 0.55 },
},
lsp_references = {
layout_config = { width = width_large, preview_width = 0.55 },
},
lsp_code_actions = {
theme = 'cursor',
previewer = false,
layout_config = { width = 0.3, height = 0.4 },
},
lsp_range_code_actions = {
theme = 'cursor',
previewer = false,
layout_config = { width = 0.3, height = 0.4 },
},
},
extensions = {
persisted = {
layout_config = { width = 0.55, height = 0.55 },
},
zoxide = {
prompt_title = '[ Zoxide directories ]',
mappings = {
default = {
action = function(selection)
vim.cmd.tcd(selection.path)
end,
after_action = function(selection)
vim.notify(
"Current working directory set to '"
.. selection.path
.. "'",
vim.log.levels.INFO
)
end,
},
},
},
},
}
end,
},
}