oil-git.nvim

March 17, 2026 ยท View on GitHub

Tests Neovim Lua

License: MIT GitHub stars GitHub last commit

Git status integration for oil.nvim - colors file/directory names and adds status symbols.

Note

malewicz1337/oil-git.nvim is the successor to benomahony/oil-git.nvim. It was created to provide a maintained, high-performance alternative with async support, directory highlighting, and debouncing.

File status Directory status

Features

  • File & directory highlighting - Instant visual feedback based on git status.
  • Status symbols - Customizable symbols (added, modified, deleted, etc.) at the end of lines.
  • Async & debounced - Non-blocking execution ensures zero lag even in massive repositories with deep directory structures.
  • Smart Refresh - Auto-updates on buffer entry, file operations, and after closing terminal toggles (like LazyGit).

Installation

lazy.nvim (no setup required):

{ "malewicz1337/oil-git.nvim", dependencies = { "stevearc/oil.nvim" } }
With custom options (as oil.nvim dependency)

This is how I use the plugin in my config:

{
  "stevearc/oil.nvim",
  dependencies = {
    { "echasnovski/mini.icons", opts = {} },
    {
      "malewicz1337/oil-git.nvim",
      dependencies = { "stevearc/oil.nvim" },
      opts = {
        show_file_highlights = true,
        show_directory_highlights = false,
        show_ignored_files = true,
      },
    },
  },
  config = function()
    require("oil").setup({
      ...
    })
  end,
}
Other plugin managers

Packer:

use { "malewicz1337/oil-git.nvim", requires = { "stevearc/oil.nvim" } }

vim-plug:

Plug 'stevearc/oil.nvim'
Plug 'malewicz1337/oil-git.nvim'

Configuration

All options with defaults:

require("oil-git").setup({
  debounce_ms = 50,
  show_file_highlights = true,
  show_directory_highlights = true,
  show_file_symbols = true,
  show_directory_symbols = true,
  show_ignored_files = false,       -- Show ignored file status
  show_ignored_directories = false, -- Show ignored directory status
  symbol_position = "eol",  -- "eol", "signcolumn", or "none"
  can_use_signcolumn = nil,  -- Optional callback(bufnr): nil|bool|string
  ignore_gitsigns_update = false,   -- Ignore GitSignsUpdate events (fallback for flickering)
  debug = false,            -- false, "minimal", or "verbose"

  symbols = {
    file = { added = "+", modified = "~", renamed = "->", deleted = "D",
             copied = "C", conflict = "!", untracked = "?", ignored = "o" },
    directory = { added = "*", modified = "*", renamed = "*", deleted = "*",
                  copied = "*", conflict = "!", untracked = "*", ignored = "o" },
  },

  -- Colors (only applied if highlight groups don't exist)
  highlights = {
    OilGitAdded = { fg = "#a6e3a1" },
    OilGitModifiedStaged = { fg = "#f9e2af" },
    OilGitModifiedUnstaged = { fg = "#e5c890" },
    OilGitRenamed = { fg = "#cba6f7" },
    OilGitDeleted = { fg = "#f38ba8" },
    OilGitCopied = { fg = "#cba6f7" },
    OilGitConflict = { fg = "#fab387" },
    OilGitUntracked = { fg = "#89b4fa" },
    OilGitIgnored = { fg = "#6c7086" },
  },
})

Signcolumn callback

When symbol_position = "signcolumn", you can optionally provide can_use_signcolumn = function(bufnr) ... end to control behavior per buffer.

  • Return nil to use the default oil.nvim compatibility check.
  • Return true to force signcolumn symbols on.
  • Return false to force signcolumn symbols off.
  • Return a string (for example "yes:2") to force signcolumn symbols on and set the window signcolumn value when symbols are present.

Git Status Reference

StatusFile SymbolColorDescription
Added+GreenStaged new file
Modified (staged)~YellowChanges staged in the index
Modified (unstaged)~GoldChanges only in the worktree
Renamed->PurpleRenamed file
DeletedDRedDeleted file
CopiedCPurpleCopied file
Conflict!OrangeMerge conflict
Untracked?BlueNew untracked file
IgnoredoGrayIgnored file

Directory Status Priority

Directories show the highest-priority status among their contents:

PriorityStatusDescription
8ConflictMerge conflicts need immediate attention
7Modified (staged)Staged changes take precedence in directories
6Modified (unstaged)Worktree-only changes
5DeletedDeleted files
4AddedNew staged files
3Renamed/CopiedRenamed or copied files
2UntrackedNew untracked files
1IgnoredOnly shown when show_ignored_directories = true

Usage

  • :lua require("oil-git").refresh() - Manual refresh
  • :checkhealth oil-git - Check plugin health

Status auto-refreshes on buffer enter, file operations, focus changes, and terminal close (LazyGit, etc.).

Requirements

Credits

License

MIT