aaronhallaert/advanced-git-search.nvim

github github
plugingit
stars 175
issues 2
subscribers 2
forks 3
CREATED

2023-03-01

UPDATED

25 days ago


Advanced Git Search

An advanced git search extension for Telescope and fzf-lua.

Search your git history by commit message, content and author in Neovim

🖥️ Usage

📖 Open a picker

🔭 Telescope

:Telescope advanced_git_search {function_name}

or in lua

require('telescope').extensions.advanced_git_search.{function_name}()

or through another Telescope picker

execute :AdvancedGitSearch, choose your picker and press <CR>

🧎 fzf-lua

require('advanced_git_search.fzf').{function_name}()

or through another picker

execute :AdvancedGitSearch, choose your picker and press <CR>

🔎 Enter a query

Your usual search experience. See the individual commands for the grep behaviour.

✏️ Further search on commit author with @

The prompt is split on @. Everything following the @ is the pattern for the author name.

⚡️Commands

1. search_log_content -- Search in repo log content

Opens a window with a list of all previous commit.

Grep behaviour: filter on added, updated or removed code (log content: -G option in git).

Keymaps

  • <CR> Opens a diff of the current file with the selected commit
  • <C-e> show the entire commit for all files in neovim with diff plugin
  • <C-o> Open the selected commit in the browser
  • <C-y> copy the commit hash to clipboard

2. search_log_content_file -- Search in file log content

Opens a window with a list of git commits that changed the current file (renames included).

Grep behaviour: filter on added, updated or removed code (log content: -G option in git).

Keymaps

  • <CR> Opens a diff of the current file with the selected commit
  • <C-e> show the entire commit for all files in neovim with diff plugin
  • <C-o> Open the selected commit in the browser
  • <C-y> copy the commit hash to clipboard

3. diff_commit_file -- Diff current file with commit

Opens a window with a list of git commits that changed the current file (renames included).

Grep behaviour: filter on commit message.

Keymaps

  • <CR> Opens a diff of the current file with the selected commit
  • <C-e> show the entire commit for all files in neovim with diff plugin
  • <C-o> Open the selected commit in the browser
  • <C-y> copy the commit hash to clipboard

4. diff_commit_line -- Diff current file with selected line history

Opens a window with a list of previous commit logs with respect to selected lines

Grep behaviour: filter on commit message.

How to use

This workaround only applies when you use the following command. (Telescope)

:Telescope advanced_git_search diff_commit_line

First you have to select the lines in visual mode, then go back to normal mode and execute this command. To make a bit easier, you can wrap it in a user command and define a keybind:

vim.api.nvim_create_user_command(
    "DiffCommitLine",
    "lua require('telescope').extensions.advanced_git_search.diff_commit_line()",
    { range = true }
)

vim.api.nvim_set_keymap(
    "v",
    "<leader>dcl",
    ":DiffCommitLine<CR>",
    { noremap = true }
)

No extra setup is needed when you use :AdvancedGitSearch.

Keymaps

  • <CR> opens a diff for the current file with the corresponding file on the selected commit
  • <C-e> show the entire commit for all files in neovim with diff plugin
  • <C-o> opens a the selected commit in the browser
  • <C-y> copy the commit hash to clipboard

5. diff_branch_file -- Diff file with branch

Opens a window with a list of local branches

Grep behaviour: filter on branch name.

Keymaps

  • <CR> opens a diff for the current file with the selected branch

6. changed_on_branch -- Changed on current branch (experimental)

Opens a window with a list of changed files on the current branch (including staged files). The fork point of the current branch is determined with the following command:

git show-branch | \
    sed "s/].*//" | \
    grep "*" | \
    grep -v "$(git rev-parse --abbrev-ref HEAD)" | \
    head -n1 | \
    sed "s/^.*\\[//"

Note: this only works if there is already a commit on the current branch, otherwise the base branch can not be detected.

Grep behaviour: filter on filename.

Keymaps

  • <CR> opens the selected file.

7. checkout_reflog -- Checkout from reflog

Opens a window with all reflog entries

Keymaps

  • <CR> checkout the reflog entry

8. show_custom_functions

A telescope picker for all functions above. Enable show_builtin_git_pickers to additionally show builtin git pickers.

⚙️ Installation

Telescope

With Lazy

    {
        "aaronhallaert/advanced-git-search.nvim",
        config = function()
            -- optional: setup telescope before loading the extension
            require("telescope").setup{
                -- move this to the place where you call the telescope setup function
                extensions = {
                    advanced_git_search = {
                        -- fugitive or diffview
                        diff_plugin = "fugitive",
                        -- customize git in previewer
                        -- e.g. flags such as { "--no-pager" }, or { "-c", "delta.side-by-side=false" }
                        git_flags = {},
                        -- customize git diff in previewer
                        -- e.g. flags such as { "--raw" }
                        git_diff_flags = {},
                        -- Show builtin git pickers when executing "show_custom_functions" or :AdvancedGitSearch
                        show_builtin_git_pickers = false,
                    }
                }
            }

            require("telescope").load_extension("advanced_git_search")
        end,
        dependencies = {
            "nvim-telescope/telescope.nvim",
            -- to show diff splits and open commits in browser
            "tpope/vim-fugitive",
            -- to open commits in browser with fugitive
            "tpope/vim-rhubarb",
            -- OPTIONAL: to replace the diff from fugitive with diffview.nvim
            -- (fugitive is still needed to open in browser)
            -- "sindrets/diffview.nvim",
        },
    }

With Packer

    use({
        "aaronhallaert/advanced-git-search.nvim",
        config = function()
            -- optional: setup telescope before loading the extension
            require("telescope").setup{
                -- move this to the place where you call the telescope setup function
                extensions = {
                    advanced_git_search = {
                        -- Fugitive or diffview
                        diff_plugin = "fugitive",
                        -- Customize git in previewer
                        -- e.g. flags such as { "--no-pager" }, or { "-c", "delta.side-by-side=false" }
                        git_flags = {},
                        -- Customize git diff in previewer
                        -- e.g. flags such as { "--raw" }
                        git_diff_flags = {},
                        -- Show builtin git pickers when executing "show_custom_functions" or :AdvancedGitSearch
                        show_builtin_git_pickers = false,
                    }
                }
            }

            require("telescope").load_extension("advanced_git_search")
        end,
        requires = {
            "nvim-telescope/telescope.nvim",
            -- to show diff splits and open commits in browser
            "tpope/vim-fugitive",
            -- to open commits in browser with fugitive
            "tpope/vim-rhubarb",
            -- optional: to replace the diff from fugitive with diffview.nvim
            -- (fugitive is still needed to open in browser)
            -- "sindrets/diffview.nvim",
        },
    })

Fzf-lua

With Lazy

    {
        "aaronhallaert/advanced-git-search.nvim",
        config = function()
            -- optional: setup telescope before loading the extension
            require("advanced_git_search.fzf").setup{
                        -- fugitive or diffview
                        diff_plugin = "fugitive",
                        -- customize git in previewer
                        -- e.g. flags such as { "--no-pager" }, or { "-c", "delta.side-by-side=false" }
                        git_flags = {},
                        -- customize git diff in previewer
                        -- e.g. flags such as { "--raw" }
                        git_diff_flags = {},
                        -- Show builtin git pickers when executing "show_custom_functions" or :AdvancedGitSearch
                        show_builtin_git_pickers = false,
            }
        end,
        dependencies = {
            "ibhagwan/fzf-lua",
            -- to show diff splits and open commits in browser
            "tpope/vim-fugitive",
            -- to open commits in browser with fugitive
            "tpope/vim-rhubarb",
            -- OPTIONAL: to replace the diff from fugitive with diffview.nvim
            -- (fugitive is still needed to open in browser)
            -- "sindrets/diffview.nvim",
        },
    }

With Packer

    use({
        "aaronhallaert/advanced-git-search.nvim",
        config = function()
            -- optional: setup telescope before loading the extension
            require("advanced_git_search.fzf").setup{
                    -- Fugitive or diffview
                    diff_plugin = "fugitive",
                    -- Customize git in previewer
                    -- e.g. flags such as { "--no-pager" }, or { "-c", "delta.side-by-side=false" }
                    git_flags = {},
                    -- Customize git diff in previewer
                    -- e.g. flags such as { "--raw" }
                    git_diff_flags = {},
                    -- Show builtin git pickers when executing "show_custom_functions" or :AdvancedGitSearch
                    show_builtin_git_pickers = false,
                }
            }
        end,
        requires = {
            "ibhagwan/fzf-lua",
            -- to show diff splits and open commits in browser
            "tpope/vim-fugitive",
            -- to open commits in browser with fugitive
            "tpope/vim-rhubarb",
            -- optional: to replace the diff from fugitive with diffview.nvim
            -- (fugitive is still needed to open in browser)
            -- "sindrets/diffview.nvim",
        },
    })

Prerequisites

  • git
  • vim-fugitive
  • sindrets/diffview.nvim
  • telescope.nvim