Explore the source / nvim

Inside nvim.

Neovim modules, plugins, mappings, and shared theme. Browse the current public files here, or visit the nvim repository on GitHub.

nvim / main

lua/myconf/plugins/telescope.lua

View on GitHub
local themes = {
   horizontal = {
      theme = "horizontal",
      border = true,
      prompt_title = false,
      -- results_title = false,
      sorting_strategy = "ascending",
      layout_strategy = "horizontal",
   },
}

local function get_layout(layout, opts)
   opts = opts or {}
   local theme_opts = themes[layout]
   return vim.tbl_deep_extend("force", theme_opts, opts)
end

local function use_layout(picker, layout)
   return function()
      local lay = get_layout(layout)
      picker(lay)
   end
end

return {
   "nvim-telescope/telescope.nvim",
   branch = "0.1.x",
   dependencies = {
      "nvim-lua/plenary.nvim",
      { "nvim-telescope/telescope-fzf-native.nvim", build = "make" },
      "folke/todo-comments.nvim",
      "nvim-telescope/telescope-file-browser.nvim",
      "jvgrootveld/telescope-zoxide",
   },

   config = function()
      local telescope = require("telescope")
      local actions = require("telescope.actions")
      local transform_mod = require("telescope.actions.mt").transform_mod

      local fb_actions = require("telescope").extensions.file_browser.actions
      local z_utils = require("telescope._extensions.zoxide.utils")
      local trouble = require("trouble")
      local trouble_telescope = require("trouble.sources.telescope")

      local custom_actions = transform_mod({
         open_trouble_qflist = function(prompt_bufnr)
            trouble.toggle("quickfix")
         end,
      })

      telescope.setup({
         defaults = {
            path_display = { "smart" },
            color_devicons = false, -- colored icons
            mappings = {
               i = {
                  ["<C-k>"] = actions.move_selection_previous,
                  ["<C-j>"] = actions.move_selection_next,

                  -- preview scrolling
                  ["<C-i>"] = actions.preview_scrolling_up,
                  ["<C-u>"] = actions.preview_scrolling_down,

                  -- select multiple
                  ["<C-a>"] = actions.toggle_all,
                  ["<C-BS>"] = actions.toggle_selection,
                  ["<Tab>"] = actions.toggle_selection + actions.move_selection_worse, -- doesn't work well
                  ["<S-Tab>"] = actions.toggle_selection + actions.move_selection_better,

                  ["<C-o>"] = actions.select_tab,
                  ["<C-p>"] = require("telescope.actions.layout").toggle_preview,
                  ["<c-d>"] = { "<C-u>", type = "command" },

                  ["<C-q>"] = actions.send_selected_to_qflist + custom_actions.open_trouble_qflist,
                  ["<C-t>"] = trouble_telescope.open,
                  ["<Esc>"] = actions.close,
               },
               -- n = {
               --    ["<Tab>"] = actions.toggle_selection + actions.move_selection_worse,
               --    ["<S-Tab>"] = actions.toggle_selection + actions.move_selection_better,
               --    ["<C-a>"] = actions.toggle_all,
               --    ["<C-BS>"] = actions.toggle_selection,
               -- },
            },

            layout_strategy = "vertical",
            layout_config = {
               vertical = {
                  preview_cutoff = -1,
                  height = 0.9,
                  prompt_position = "bottom",
                  width = 0.8,
               },
            },
         },

         pickers = {
            live_grep = {
               -- disable_devicons = true, -- disable file icons
               file_ignore_patterns = { "node_modules/", ".git/", "build/" },
               additional_args = function(_)
                  return { "--hidden" } -- include hidden files
               end,
            },

            find_files = {
               -- disable_devicons = true, -- disable file icons
               file_ignore_patterns = { "node_modules/", ".git/", "build/" },
               find_command = { "fd", "--type", "f", "--hidden", "--exclude", ".DS_Store" }, -- use fd instead of find
            },

            oldfiles = {
               -- disable_devicons = true, -- disable file icons
               file_ignore_patterns = { "node_modules/", ".git/", "build/" },
            },

            grep_string = {
               -- disable_devicons = true, -- disable file icons
               file_ignore_patterns = { "node_modules/", ".git/", "build/" },
            },

            buffers = {
               mappings = {
                  i = {
                     ["<C-d>"] = function(prompt_bufnr) -- custom mapping to delete buffer
                        local action_state = require("telescope.actions.state")
                        local current_picker = action_state.get_current_picker(prompt_bufnr)
                        local selected_entry = action_state.get_selected_entry()
                        local bufnr_to_delete = selected_entry.bufnr
                        vim.api.nvim_buf_delete(bufnr_to_delete, { force = true })
                        current_picker:delete_selection(function(selection)
                           return selection.bufnr == bufnr_to_delete
                        end)
                     end,
                  },

                  n = {
                     ["<C-d>"] = function(prompt_bufnr) -- custom mapping to delete buffer
                        local action_state = require("telescope.actions.state")
                        local current_picker = action_state.get_current_picker(prompt_bufnr)
                        local selected_entry = action_state.get_selected_entry()
                        local bufnr_to_delete = selected_entry.bufnr
                        vim.api.nvim_buf_delete(bufnr_to_delete, { force = true })
                        current_picker:delete_selection(function(selection)
                           return selection.bufnr == bufnr_to_delete
                        end)
                     end,
                  },
               },
            },
         },

         extensions = {
            file_browser = {
               -- disable_devicons = true, -- disable file icons
               file_ignore_patterns = { "node_modules/", ".git/" },
               hidden = { file_browser = false, folder_browser = false },
               prompt_path = true,
               mappings = {
                  i = {
                     ["<C-h>"] = fb_actions.goto_home_dir,
                     ["<C-S-h>"] = fb_actions.toggle_hidden, -- toggle hidden files in file browsing
                  },
               },
            },

            zoxide = {
               prompt_title = "Zoxide Paths",
               mappings = {
                  default = {
                     after_action = function(selection)
                        print("Update to (" .. selection.z_score .. ") " .. selection.path)
                     end,
                  },
                  ["<C-s>"] = {
                     before_action = function(selection)
                        print("before C-s")
                     end,
                     action = function(selection)
                        vim.cmd.edit(selection.path)
                     end,
                  },
                  -- Opens the selected entry in a new split
                  ["<C-q>"] = { action = z_utils.create_basic_command("split") },
               },
            },

            fzf = {
               fuzzy = false,
               override_generic_sorter = true,
               override_file_sorter = true,
               case_mode = "smart_case",
            },
         },
      })

      telescope.load_extension("fzf")
      telescope.load_extension("file_browser")
      telescope.load_extension("zoxide")

      local telescope_builtin = require("telescope.builtin")

      -- set keymaps
      local key = vim.keymap

      key.set(
         "n",
         "<leader>fc",
         use_layout(telescope_builtin.current_buffer_fuzzy_find, "horizontal"),
         { desc = "Find in current buffer" }
      )
      key.set("n", "<leader>ff", "<cmd>Telescope find_files<cr>", { desc = "Find files in cwd" })
      key.set("n", "<leader>fr", "<cmd>Telescope oldfiles<cr>", { desc = "Find recent files" })
      key.set("n", "<leader>fs", "<cmd>Telescope live_grep<cr>", { desc = "Find string in cwd" })
      key.set("n", "<leader>fg", "<cmd>Telescope grep_string<cr>", { desc = "Find string under cursor in cwd" })
      key.set("n", "<leader>fb", "<cmd>Telescope buffers<cr>", { desc = "Show open buffers" })

      key.set("n", "<leader>fh", "<cmd>TodoTelescope<cr>", { desc = "Find todos" })
      key.set("n", "<space>ft", ":Telescope file_browser<CR>", { desc = "File browser" })
      key.set("n", "<leader>fz", require("telescope").extensions.zoxide.list, { desc = "Zoxide Paths" })

      vim.api.nvim_create_user_command("GrepOpenFiles", function()
         require("telescope.builtin").live_grep({ grep_open_files = true })
      end, {}) -- search with telecope in opened files

      key.set(
         "n",
         "<leader>fv",
         "<cmd>lua require('telescope.builtin').live_grep({search_dirs={vim.fn.expand('%:p')}})<CR>",
         { desc = "Find string in current file" }
      )

      -- LaTeX picker
      local latex_picker = require("myconf.plugins.telescope.latex")
      vim.api.nvim_create_autocmd("FileType", {
         pattern = "tex",
         callback = function(ev)
            vim.keymap.set("n", "\\lf", latex_picker.latex_picker, {
               buffer = ev.buf,
               desc = "LaTeX picker",
               noremap = true,
               silent = true,
            })
         end,
      })
   end,
}