telescope-nvim

{ config, pkgs, stdenv, lib, ... }:
let
  my-telescope-nvim = {
    plugin = pkgs.vimPlugins.telescope-nvim;
    type = "lua";
    config = /*lua*/ ''
      -- search relative to file
      -- https://github.com/nvim-telescope/telescope.nvim/pull/902
      vim.keymap.set('n', '<space>f', function() require('telescope.builtin').find_files({cwd=require'telescope.utils'.buffer_dir()}) end)
      vim.keymap.set('n', '<space>F', require('telescope.builtin').find_files)
      vim.keymap.set('n', '<space>b', require('telescope.builtin').buffers)
      vim.keymap.set('n', '<space>h', require('telescope.builtin').help_tags)
      vim.keymap.set('n', '<space>t', require('telescope.builtin').treesitter)
      vim.keymap.set('n', '<space>c', require('telescope.builtin').command_history)
      vim.keymap.set('n', '<space>C', require('telescope.builtin').commands)
    '';
  };
  # Problem: unable to fuzzy search parenthesis '('
  # https://github.com/nvim-telescope/telescope-fzf-native.nvim/issues/141
  my-telescope-fzf-native-nvim = {
    plugin = pkgs.vimPlugins.telescope-fzf-native-nvim;
    type = "lua";
    config = /*lua*/ ''
      require('telescope').setup {
        extensions = {fzf = {}},
        defaults = {
          layout_strategy = 'vertical',
          layout_config = {
            height = 0.95,
            width = 0.95,
            -- do not disable preview
            preview_cutoff = 1,
          },
        },
      }
      require('telescope').load_extension('fzf')
    '';
  };
  my-telescope-live-grep-args-nvim = {
    plugin = pkgs.vimPlugins.telescope-live-grep-args-nvim;
    type = "lua";
    config = /*lua*/ ''
      require('telescope').load_extension("live_grep_args")
      vim.keymap.set('n', '<space>g', function() require("telescope").extensions.live_grep_args.live_grep_args({search_dirs={require"telescope.utils".buffer_dir()}}) end)
      vim.keymap.set('n', '<space>G', require("telescope").extensions.live_grep_args.live_grep_args)
    '';
  };
in {
  programs.neovim = {
    plugins = [
      my-telescope-nvim
      my-telescope-fzf-native-nvim
      pkgs.vimPlugins.plenary-nvim
      my-telescope-live-grep-args-nvim
    ];
  };
}