]> git.rmz.io Git - dotfiles.git/commitdiff
nvim: extract telescope config into picker.lua
authorSamir Benmendil <me@rmz.io>
Sun, 9 Feb 2025 20:34:56 +0000 (20:34 +0000)
committerSamir Benmendil <me@rmz.io>
Sun, 2 Mar 2025 16:05:27 +0000 (16:05 +0000)
nvim/lua/config/options.lua
nvim/lua/plugins/editor.lua
nvim/lua/plugins/picker.lua [new file with mode: 0644]

index d0ef34be4aa3aa18e07738839aea346c980dd608..5fce922343aa74f25701b3e3f270f621d502db62 100644 (file)
@@ -22,5 +22,3 @@ if vim.fn.has("nvim-0.9.0") == 1 then
 end
 -- do not let markdown plugin change indent
 vim.g.markdown_recommended_style = 0
 end
 -- do not let markdown plugin change indent
 vim.g.markdown_recommended_style = 0
-
-vim.g.lazyvim_picker = "telescope"
index c3281fe04b8b6429c6dce9d0398c7577ca6bcfaa..0b331bff80551f1babcd51a0a744ebdb6b409188 100644 (file)
@@ -1,95 +1,5 @@
----@type LazyPluginSpec
+---@type LazySpec
 return {
 return {
-  {
-    "nvim-telescope/telescope.nvim",
-    keys = {
-      { "<leader>fF", LazyVim.pick("files", { cwd = false }), desc = "Find Files (cwd)" },
-      -- from lazyvim
-      { "<leader>,", "<cmd>Telescope buffers show_all_buffers=true<cr>", desc = "Switch Buffer" },
-      { "<leader>/", LazyVim.pick("live_grep"), desc = "Grep (root dir)" },
-      { "<leader>:", "<cmd>Telescope command_history<cr>", desc = "Command History" },
-      { "<leader><space>", LazyVim.pick("files"), desc = "Find Files (root dir)" },
-      { "<leader><space>", false },
-      -- find
-      { "<leader>fb", "<cmd>Telescope buffers sort_lastused=true<CR>", desc = "Buffers" },
-      -- { "<leader>ff", LazyVim.pick("files"), desc = "Find Files (root dir)" },
-      { "<leader>ff", false }, -- fswitch
-      { "<leader>fF", LazyVim.pick("files", { cwd = false }), desc = "Find Files (cwd)" },
-      { "<leader>fr", "<cmd>Telescope oldfiles<cr>", desc = "Recent" },
-      { "<leader>fR", LazyVim.pick("oldfiles", { cwd = vim.loop.cwd() }), desc = "Recent (cwd)" },
-      -- git
-      -- { "<leader>gc", "<cmd>Telescope git_commits<CR>", desc = "commits" },
-      { "<leader>gc", false },
-      -- { "<leader>gs", "<cmd>Telescope git_status<CR>", desc = "status" },
-      { "<leader>gs", false },
-      -- search
-      { "<leader>sa", "<cmd>Telescope autocommands<cr>", desc = "Auto Commands" },
-      { "<leader>sb", "<cmd>Telescope current_buffer_fuzzy_find<cr>", desc = "Buffer" },
-      { "<leader>sc", "<cmd>Telescope command_history<cr>", desc = "Command History" },
-      { "<leader>sC", "<cmd>Telescope commands<cr>", desc = "Commands" },
-      { "<leader>sd", "<cmd>Telescope diagnostics bufnr=0<cr>", desc = "Document diagnostics" },
-      { "<leader>sD", "<cmd>Telescope diagnostics<cr>", desc = "Workspace diagnostics" },
-      { "<leader>sg", LazyVim.pick("live_grep"), desc = "Grep (root dir)" },
-      { "<leader>sG", LazyVim.pick("live_grep", { cwd = false }), desc = "Grep (cwd)" },
-      { "<leader>sh", "<cmd>Telescope help_tags<cr>", desc = "Help Pages" },
-      { "<leader>sH", "<cmd>Telescope highlights<cr>", desc = "Search Highlight Groups" },
-      { "<leader>sk", "<cmd>Telescope keymaps<cr>", desc = "Key Maps" },
-      { "<leader>sM", "<cmd>Telescope man_pages<cr>", desc = "Man Pages" },
-      { "<leader>sm", "<cmd>Telescope marks<cr>", desc = "Jump to Mark" },
-      { "<leader>so", "<cmd>Telescope vim_options<cr>", desc = "Options" },
-      { "<leader>sR", "<cmd>Telescope resume<cr>", desc = "Resume" },
-      { "<leader>sw", LazyVim.pick("grep_string"), desc = "Word (root dir)" },
-      { "<leader>sW", LazyVim.pick("grep_string", { cwd = false }), desc = "Word (cwd)" },
-      { "<leader>uC", LazyVim.pick("colorscheme", { enable_preview = true }), desc = "Colorscheme with preview" },
-      -- {
-      --   "<leader>ss",
-      --   LazyVim.pick("lsp_document_symbols", {
-      --     symbols = {
-      --       "Class",
-      --       "Function",
-      --       "Method",
-      --       "Constructor",
-      --       "Interface",
-      --       "Module",
-      --       "Struct",
-      --       "Trait",
-      --       "Field",
-      --       "Property",
-      --     },
-      --   }),
-      --   desc = "Goto Symbol",
-      -- },
-      { "<leader>ss", false }, -- use for snippets below
-      {
-        "<leader>sS",
-        LazyVim.pick("lsp_dynamic_workspace_symbols", {
-          symbols = {
-            "Class",
-            "Function",
-            "Method",
-            "Constructor",
-            "Interface",
-            "Module",
-            "Struct",
-            "Trait",
-            "Field",
-            "Property",
-          },
-        }),
-        desc = "Goto Symbol (Workspace)",
-      },
-    },
-  },
-  {
-    "benfowler/telescope-luasnip.nvim",
-    dependencies = {
-      "telescope.nvim",
-    },
-    config = function()
-      require("telescope").load_extension("luasnip")
-    end,
-    keys = { { "<leader>ss", "<cmd>Telescope luasnip<cr>", desc = "Snippets" } },
-  },
   {
     "stevearc/oil.nvim",
     opts = {
   {
     "stevearc/oil.nvim",
     opts = {
diff --git a/nvim/lua/plugins/picker.lua b/nvim/lua/plugins/picker.lua
new file mode 100644 (file)
index 0000000..7b98619
--- /dev/null
@@ -0,0 +1,312 @@
+vim.g.lazyvim_picker = "telescope"
+
+---@type LazyPicker
+local picker = {
+  name = "telescope",
+  commands = {
+    files = "find_files",
+  },
+  -- this will return a function that calls telescope.
+  -- cwd will default to lazyvim.util.get_root
+  -- for `files`, git_files or find_files will be chosen depending on .git
+  ---@param builtin string
+  ---@param opts? lazyvim.util.pick.Opts
+  open = function(builtin, opts)
+    opts = opts or {}
+    opts.follow = opts.follow ~= false
+    if opts.cwd and opts.cwd ~= vim.uv.cwd() then
+      local function open_cwd_dir()
+        local action_state = require("telescope.actions.state")
+        local line = action_state.get_current_line()
+        LazyVim.pick.open(
+          builtin,
+          vim.tbl_deep_extend("force", {}, opts or {}, {
+            root = false,
+            default_text = line,
+          })
+        )
+      end
+      ---@diagnostic disable-next-line: inject-field
+      opts.attach_mappings = function(_, map)
+        -- opts.desc is overridden by telescope, until it's changed there is this fix
+        map("i", "<a-c>", open_cwd_dir, { desc = "Open cwd Directory" })
+        return true
+      end
+    end
+
+    require("telescope.builtin")[builtin](opts)
+  end,
+}
+
+if not LazyVim.pick.register(picker) then
+  return {}
+end
+---@type LazySpec
+return {
+  { "nvim-telescope/telescope.nvim",
+    cmd = "Telescope",
+    version = false, -- telescope did only one release, so use HEAD for now
+    dependencies = {
+      { "nvim-telescope/telescope-fzf-native.nvim",
+        build = "cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build",
+        config = function(plugin)
+          LazyVim.on_load("telescope.nvim", function()
+            local ok, err = pcall(require("telescope").load_extension, "fzf")
+            if not ok then
+              local lib = plugin.dir .. "/build/libfzf." .. (LazyVim.is_win() and "dll" or "so")
+              if not vim.uv.fs_stat(lib) then
+                LazyVim.warn("`telescope-fzf-native.nvim` not built. Rebuilding...")
+                require("lazy").build({ plugins = { plugin }, show = false }):wait(function()
+                  LazyVim.info("Rebuilding `telescope-fzf-native.nvim` done.\nPlease restart Neovim.")
+                end)
+              else
+                LazyVim.error("Failed to load `telescope-fzf-native.nvim`:\n" .. err)
+              end
+            end
+          end)
+        end,
+      },
+    },
+    keys = {
+      -- from lazyvim
+      { "<leader>,", "<cmd>Telescope buffers show_all_buffers=true<cr>", desc = "Switch Buffer" },
+      { "<leader>/", LazyVim.pick("live_grep"), desc = "Grep (Root Dir)" },
+      { "<leader>:", "<cmd>Telescope command_history<cr>", desc = "Command History" },
+      -- { "<leader><space>", LazyVim.pick("files"), desc = "Find Files (Root Dir)" },
+      { "<leader><space>", false },
+      -- find
+      {
+        "<leader>fb",
+        "<cmd>Telescope buffers sort_mru=true sort_lastused=true ignore_current_buffer=true<cr>",
+        desc = "Buffers",
+      },
+      { "<leader>fc", LazyVim.pick.config_files(), desc = "Find Config File" },
+      -- { "<leader>ff", LazyVim.pick("files"), desc = "Find Files (root dir)" },
+      { "<leader>ff", false }, -- fswitch
+      { "<leader>fF", LazyVim.pick("files", { root = false }), desc = "Find Files (cwd)" },
+      { "<leader>fg", "<cmd>Telescope git_files<cr>", desc = "Find Files (git-files)" },
+      { "<leader>fr", "<cmd>Telescope oldfiles<cr>", desc = "Recent" },
+      { "<leader>fR", LazyVim.pick("oldfiles", { cwd = vim.uv.cwd() }), desc = "Recent (cwd)" },
+      -- git
+      -- { "<leader>gc", "<cmd>Telescope git_commits<CR>", desc = "Commits" },
+      -- { "<leader>gs", "<cmd>Telescope git_status<CR>", desc = "Status" },
+      { "<leader>gc", false },
+      { "<leader>gs", false },
+      -- search
+      { '<leader>s"', "<cmd>Telescope registers<cr>", desc = "Registers" },
+      { "<leader>sa", "<cmd>Telescope autocommands<cr>", desc = "Auto Commands" },
+      { "<leader>sb", "<cmd>Telescope current_buffer_fuzzy_find<cr>", desc = "Buffer" },
+      { "<leader>sc", "<cmd>Telescope command_history<cr>", desc = "Command History" },
+      { "<leader>sC", "<cmd>Telescope commands<cr>", desc = "Commands" },
+      { "<leader>sd", "<cmd>Telescope diagnostics bufnr=0<cr>", desc = "Document Diagnostics" },
+      { "<leader>sD", "<cmd>Telescope diagnostics<cr>", desc = "Workspace Diagnostics" },
+      { "<leader>sg", LazyVim.pick("live_grep"), desc = "Grep (Root Dir)" },
+      { "<leader>sG", LazyVim.pick("live_grep", { root = false }), desc = "Grep (cwd)" },
+      { "<leader>sh", "<cmd>Telescope help_tags<cr>", desc = "Help Pages" },
+      { "<leader>sH", "<cmd>Telescope highlights<cr>", desc = "Search Highlight Groups" },
+      { "<leader>sj", "<cmd>Telescope jumplist<cr>", desc = "Jumplist" },
+      { "<leader>sk", "<cmd>Telescope keymaps<cr>", desc = "Key Maps" },
+      { "<leader>sl", "<cmd>Telescope loclist<cr>", desc = "Location List" },
+      { "<leader>sM", "<cmd>Telescope man_pages<cr>", desc = "Man Pages" },
+      { "<leader>sm", "<cmd>Telescope marks<cr>", desc = "Jump to Mark" },
+      { "<leader>so", "<cmd>Telescope vim_options<cr>", desc = "Options" },
+      { "<leader>sR", "<cmd>Telescope resume<cr>", desc = "Resume" },
+      { "<leader>sq", "<cmd>Telescope quickfix<cr>", desc = "Quickfix List" },
+      { "<leader>sw", LazyVim.pick("grep_string", { word_match = "-w" }), desc = "Word (Root Dir)" },
+      { "<leader>sW", LazyVim.pick("grep_string", { root = false, word_match = "-w" }), desc = "Word (cwd)" },
+      { "<leader>sw", LazyVim.pick("grep_string"), mode = "v", desc = "Selection (Root Dir)" },
+      { "<leader>sW", LazyVim.pick("grep_string", { root = false }), mode = "v", desc = "Selection (cwd)" },
+      { "<leader>uC", LazyVim.pick("colorscheme", { enable_preview = true }), desc = "Colorscheme with Preview" },
+      -- {
+      --   "<leader>ss",
+      --   LazyVim.pick("lsp_document_symbols", {
+      --     symbols = {
+      --       "Class",
+      --       "Function",
+      --       "Method",
+      --       "Constructor",
+      --       "Interface",
+      --       "Module",
+      --       "Struct",
+      --       "Trait",
+      --       "Field",
+      --       "Property",
+      --     },
+      --   }),
+      --   desc = "Goto Symbol",
+      -- },
+      { "<leader>ss", false }, -- use for snippets below
+      {
+        "<leader>sS",
+        LazyVim.pick("lsp_dynamic_workspace_symbols", {
+          symbols = {
+            "Class",
+            "Function",
+            "Method",
+            "Constructor",
+            "Interface",
+            "Module",
+            "Struct",
+            "Trait",
+            "Field",
+            "Property",
+          },
+        }),
+        desc = "Goto Symbol (Workspace)",
+      },
+    },
+    opts = function()
+      local actions = require("telescope.actions")
+
+      local open_with_trouble = function(...)
+        return require("trouble.sources.telescope").open(...)
+      end
+      local find_files_no_ignore = function()
+        local action_state = require("telescope.actions.state")
+        local line = action_state.get_current_line()
+        LazyVim.pick("find_files", { no_ignore = true, default_text = line })()
+      end
+      local find_files_with_hidden = function()
+        local action_state = require("telescope.actions.state")
+        local line = action_state.get_current_line()
+        LazyVim.pick("find_files", { hidden = true, default_text = line })()
+      end
+
+      local function find_command()
+        if 1 == vim.fn.executable("rg") then
+          return { "rg", "--files", "--color", "never", "-g", "!.git" }
+        elseif 1 == vim.fn.executable("fd") then
+          return { "fd", "--type", "f", "--color", "never", "-E", ".git" }
+        elseif 1 == vim.fn.executable("fdfind") then
+          return { "fdfind", "--type", "f", "--color", "never", "-E", ".git" }
+        elseif 1 == vim.fn.executable("find") and vim.fn.has("win32") == 0 then
+          return { "find", ".", "-type", "f" }
+        elseif 1 == vim.fn.executable("where") then
+          return { "where", "/r", ".", "*" }
+        end
+      end
+
+      return {
+        defaults = {
+          prompt_prefix = " ",
+          selection_caret = " ",
+          -- open files in the first window that is an actual file.
+          -- use the current window if no other window is available.
+          get_selection_window = function()
+            local wins = vim.api.nvim_list_wins()
+            table.insert(wins, 1, vim.api.nvim_get_current_win())
+            for _, win in ipairs(wins) do
+              local buf = vim.api.nvim_win_get_buf(win)
+              if vim.bo[buf].buftype == "" then
+                return win
+              end
+            end
+            return 0
+          end,
+          mappings = {
+            i = {
+              ["<c-t>"] = open_with_trouble,
+              ["<a-t>"] = open_with_trouble,
+              ["<a-i>"] = find_files_no_ignore,
+              ["<a-h>"] = find_files_with_hidden,
+              ["<C-Down>"] = actions.cycle_history_next,
+              ["<C-Up>"] = actions.cycle_history_prev,
+              ["<C-f>"] = actions.preview_scrolling_down,
+              ["<C-b>"] = actions.preview_scrolling_up,
+            },
+            n = {
+              ["q"] = actions.close,
+            },
+          },
+        },
+        pickers = {
+          find_files = {
+            find_command = find_command,
+            hidden = true,
+          },
+        },
+      }
+    end,
+  },
+
+  -- Flash Telescope config
+  {
+    "nvim-telescope/telescope.nvim",
+    optional = true,
+    opts = function(_, opts)
+      if not LazyVim.has("flash.nvim") then
+        return
+      end
+      local function flash(prompt_bufnr)
+        require("flash").jump({
+          pattern = "^",
+          label = { after = { 0, 0 } },
+          search = {
+            mode = "search",
+            exclude = {
+              function(win)
+                return vim.bo[vim.api.nvim_win_get_buf(win)].filetype ~= "TelescopeResults"
+              end,
+            },
+          },
+          action = function(match)
+            local picker = require("telescope.actions.state").get_current_picker(prompt_bufnr)
+            picker:set_selection(match.pos[1] - 1)
+          end,
+        })
+      end
+      opts.defaults = vim.tbl_deep_extend("force", opts.defaults or {}, {
+        mappings = { n = { s = flash }, i = { ["<c-s>"] = flash } },
+      })
+    end,
+  },
+
+  -- better vim.ui with telescope
+  {
+    "stevearc/dressing.nvim",
+    lazy = true,
+    enabled = function()
+      return LazyVim.pick.want() == "telescope"
+    end,
+    init = function()
+      ---@diagnostic disable-next-line: duplicate-set-field
+      vim.ui.select = function(...)
+        require("lazy").load({ plugins = { "dressing.nvim" } })
+        return vim.ui.select(...)
+      end
+      ---@diagnostic disable-next-line: duplicate-set-field
+      vim.ui.input = function(...)
+        require("lazy").load({ plugins = { "dressing.nvim" } })
+        return vim.ui.input(...)
+      end
+    end,
+  },
+
+  {
+    "neovim/nvim-lspconfig",
+    opts = function()
+      if LazyVim.pick.want() ~= "telescope" then
+        return
+      end
+      local Keys = require("lazyvim.plugins.lsp.keymaps").get()
+      -- stylua: ignore
+      vim.list_extend(Keys, {
+        { "gd", function() require("telescope.builtin").lsp_definitions({ reuse_win = true }) end, desc = "Goto Definition", has = "definition" },
+        { "gr", "<cmd>Telescope lsp_references<cr>", desc = "References", nowait = true },
+        { "gI", function() require("telescope.builtin").lsp_implementations({ reuse_win = true }) end, desc = "Goto Implementation" },
+        { "gy", function() require("telescope.builtin").lsp_type_definitions({ reuse_win = true }) end, desc = "Goto T[y]pe Definition" },
+      })
+    end,
+  },
+
+  {
+    "benfowler/telescope-luasnip.nvim",
+    dependencies = {
+      "telescope.nvim",
+    },
+    config = function()
+      require("telescope").load_extension("luasnip")
+    end,
+    keys = { { "<leader>ss", "<cmd>Telescope luasnip<cr>", desc = "Snippets" } },
+  },
+}